#c# #razor
#c# #razor
Вопрос:
У меня есть внутренний ASP.NET Основное приложение использует страницы Razor, и я хотел бы отслеживать, кто и когда обращается к приложению. У меня есть таблица SQL для хранения значений, которые я собираю. Мой код страницы Razor (частичный) выглядит следующим образом:
<form method="post" name="track" id="track">
<input type="hidden" asp-for="tracking.Name" value="@User.Identity.Name" />
<input type="hidden" asp-for="tracking.Time" value="@DateTime.Now" />
</form>
Код C # заключается в следующем:
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.tracking.Add(tracking);
await _context.SaveChangesAsync();
return Page();
}
Это приводит к бесконечному циклу, в котором форма отправляется, страница перезагружается, форма отправляется и страница перезагружается……
Я пробовал использовать «onunload» и «onbeforeunload», но ни одна из них не работает. Есть ли лучший способ сделать это или я упускаю что-то простое?
Ответ №1:
Вы попадаете в цикл, потому что вы публикуете и возвращаете страницу снова. Запустите и забудьте запрос с помощью JavaScript к контроллеру API. Предположительно, у вас есть такой класс:
public class Tracking
{
public string Name { get; set; }
public DateTime Time { get; set; }
}
Итак, мы воспользуемся этим в следующем контроллере:
[Route("api/[controller]")]
[ApiController]
public class TrackingController : ControllerBase
{
[HttpPost]
public IActionResult Index([FromBody] Tracking tracking)
{
return NoContent();
}
}
Под вашей страницей в .cshtml
файле добавьте:
@section Scripts {
<script type="text/javascript">
$(function () {
// Notice the underscores.
var data = {
"name": $("#Tracking_Name").val(),
"time": $("#Tracking_Time").val()
};
$.ajax({
type: "POST",
url: "/api/tracking",
data: JSON.stringify(data),
contentType: "application/json"
});
});
</script>
}
Если вы еще не настроили контроллеры в своем проекте, вам нужно вызвать
services.AddControllers();
Startup.ConfigureServices()
и измените app.UseEndpoints()
в том же файле что-то вроде:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
// Your current routes.
});
в противном случае он не найдет контроллер.
Еще одна вещь: DateTime.Now
не будет действительной даты в формате JSON, поэтому вам следует либо получить дату на стороне клиента, либо сначала сериализовать ее в скрытое поле. Если вы этого не сделаете, публикация завершится ошибкой.