Автоматическое размещение формы при загрузке страницы (страницы Razor)

#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, поэтому вам следует либо получить дату на стороне клиента, либо сначала сериализовать ее в скрытое поле. Если вы этого не сделаете, публикация завершится ошибкой.