Передача бритвенной формы с использованием JQuery AJAX в MVC6 с использованием встроенных функций
Я хотел бы знать, есть ли какой-либо способ отправить форму с помощью jQuery AJAX в MVC6, все еще используя функции автоматического привязки ASP.NET MVC. Я верю, что в других версиях MVC вы можете использовать jquery.unobtrusive-ajax и просто использовать
@using (Ajax.BeginForm("SaveData", new AjaxOptions(){}
Поскольку в MVC6 произошли некоторые изменения, мне интересно, как новый рекомендуемый способ сделать это, помимо выполнения обычной AJAX-почты на сервере при отправке формы. Этот смысл я бы вручную получил значения каждого поля ввода, превратил их в JSON и отправил их на контроллер, чтобы все связалось с ViewModel.
Если я использую следующий JavaScript для AJAX, любые настройки формы AJAX даже имеют значение?
$('form').submit(function () {
$.ajax({
type: "POST",
url: "/Products/Create/",
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json"
});
});
Ответы
Ответ 1
Ajax работает одинаково, но вместо помощника @Ajax используйте новые помощники тегов MVC 6 (не забудьте ссылаться на сценарии jquery и jquery.unobtrusive-ajax).
JQuery Ненавязчивый Ajax существует в репозитории Asp.Net GitHub и может быть Bower pull.
Используя новый MVC TagHelpers, вы просто объявляете форму следующим образом:
<form asp-controller="Home" asp-action="SaveForm" data-ajax="true" data-ajax-method="POST">
...
</form>
Чтобы использовать AjaxOptions, существовавшие в Ajax Helper в предыдущих версиях MVC, просто добавьте эти атрибуты в тег формы следующим образом:
<form asp-controller="Home" asp-action="SaveForm" data-ajax="true" data-ajax-method="POST" data-ajax-mode="replace" data-ajax-update="#content">
...
</form>
<div id="content"></div>
Атрибуты HTML (ранее AjaxOptions), которые вы можете использовать в форме, следующие (исходный источник):
+------------------------+-----------------------------+
| AjaxOptions | HTML attribute |
+------------------------+-----------------------------+
| Confirm | data-ajax-confirm |
| HttpMethod | data-ajax-method |
| InsertionMode | data-ajax-mode |
| LoadingElementDuration | data-ajax-loading-duration |
| LoadingElementId | data-ajax-loading |
| OnBegin | data-ajax-begin |
| OnComplete | data-ajax-complete |
| OnFailure | data-ajax-failure |
| OnSuccess | data-ajax-success |
| UpdateTargetId | data-ajax-update |
| Url | data-ajax-url |
+------------------------+-----------------------------+
Еще одно существенное изменение - это проверка на стороне сервера, если запрос действительно является запросом AJAX. В предыдущих версиях мы просто использовали Request.IsAjaxRequest()
.
В MVC6 вам нужно создать простое расширение для добавления тех же опций, которые существовали в предыдущих версиях MVC (исходный источник):
/// <summary>
/// Determines whether the specified HTTP request is an AJAX request.
/// </summary>
///
/// <returns>
/// true if the specified HTTP request is an AJAX request; otherwise, false.
/// </returns>
/// <param name="request">The HTTP request.</param><exception cref="T:System.ArgumentNullException">The <paramref name="request"/> parameter is null (Nothing in Visual Basic).</exception>
public static bool IsAjaxRequest(this HttpRequest request)
{
if (request == null)
throw new ArgumentNullException("request");
if (request.Headers != null)
return request.Headers["X-Requested-With"] == "XMLHttpRequest";
return false;
}
Ответ 2
Вот действительно хороший учебник YouTube по AJAX-формам, и вы можете скачать проект по этой ссылке GitHub. Он содержит скрипт, который будет использоваться для AJAX.
Образец стиля скопирован из вышеуказанного проекта:
<form asp-controller="Home1" asp-action="SaveForm"
data-ajax="true"
data-ajax-method="POST"
data-ajax-mode="replace"
data-ajax-update="#content"
data-ajax-loading ="#divloading"
data-ajax-success="Success"
data-ajax-failure ="Failure">
<div class="form-group">
<div> <h4>@Html.Label("Name")</h4> </div>
<div> @Html.TextBox("Name","",htmlAttributes:new { @class="form-control",id="Name"})</div>
</div>
<div class="form-group">
<div><h4>@Html.Label("Age")</h4></div>
<div>@Html.TextBox("Age", "", htmlAttributes: new { @class = "form-control", id ="Age" })</div>
</div>
<br/>
<input type="submit" name="Submit" class="btn btn-block btn-success" />
</form>
Ответ 3
https://github.com/Behrouz-Goudarzi/AjaxTagHelper
AjaxTagHelper
Простое решение для использования ссылок и ajax-форм с помощью Tag Helper в ядре aspnet
Сначала скопируйте класс AjaxTagHelper из папки Extensions в ваш проект.
Во-вторых, скопируйте файл AjaxTagHelper.js из папки js в wwwroot и добавьте его в свой проект.
Затем сделайте следующее: Откройте файл viewImports и добавьте следующий код
@using AjaxTagHelper.Extensions
@using AjaxTagHelper
@using AjaxTagHelper.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, AjaxTagHelper
Чтобы использовать Action Ajax, добавьте следующий код вместо тега.
<ajax-action ajax-action="Delete" ajax-controller="Home" ajax-data-id="@Model.Id"
class="btn btn-danger btn-sm" ajax-success-func="SuccessDelete">
Delete
</ajax-action>
Используйте следующий код, чтобы использовать AJAX для отправки формы на сервер.
<div class="row">
<form id="frmCreate" class="col-sm-9">
<div class="row">
<div class="col-sm-4 form-control">
<input placeholder="Enter Name" name="Name" class="input-group" type="text" />
</div>
<div class="col-sm-4 form-control">
<input placeholder="Enter Family" name="Family" class="input-group" type="text" />
</div>
<div class="col-sm-4 form-control">
<input placeholder="Enter [email protected] " name="Email" class="input-group" type="email" />
</div>
</div>
</form>
<div class="col-sm-3">
<ajax-button ajax-controller="Home" ajax-action="Create" ajax-form-id="frmCreate" ajax-success-func="SuccessCreate"
class="btn btn-sm btn-success">
Create
</ajax-button>
</div>
</div>
Наконец, добавьте скрипты, которые вам нужны для просмотра, проверьте код ниже
<script>
function SuccessCreate(data) {
console.log(data);
$("#tbodyPerson").append(data);
}
function SuccessDelete(data) {
$("#tr" + data.id).fadeOut();
}
</script>
<script src="~/js/AjaxHelper.js"></script>