У вас есть несколько проблем, связанных с текущим примером:
1) [Authorize]
атрибут не нужен в методе POST, потому что его использование в методе действия GET должно быть достаточно для предотвращения неавторизованных пользователей.
2) Поскольку вы отправляете запрос AJAX методу POST, который включает атрибут [ValidateAntiForgeryToken]
, необходимо отправить токен предотвращения CSRF в запрос AJAX.
3) Удалить dataType: "json"
, contentType: 'application/json; charset=utf-8'
и traditional: true
так как вы отправляете одно целочисленные данные и не используете массив или строку в формате JSON.
4) Обратные вызовы AJAX предназначены для того, чтобы оставаться на той же странице, поэтому return View()
следует заменить на return PartialView()
.
Исходя из 4 вышеизложенных вопросов, если необходимо использовать AJAX, вы должны установить запрос и действие контроллера, как показано в следующем примере:
Запрос AJAX
$(document).ready(function () {
$(".buttonSendEmail").click(function () {
var orderText = $(".orderData").text();
alert(orderText);
var form = $('form');
var token = $('input[name="__RequestVerificationToken"]', form).val();
$.ajax({
type: "POST",
url: "@Url.Action("Create", "EmployersActivity")",
data: { id: 1, __RequestVerificationToken: token },
error: function (message) {
alert("error on start");
// other stuff
},
success: function (result) {
$(".contentReqGood").show();
// other stuff
}
});
});
});
Действие контроллера
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(int? id)
{
if (id == null)
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
var email = db.employees.Find(id);
if (email == null)
return HttpNotFound();
if (email != null)
{
// do something
}
return PartialView("_PartialViewName");
}
Кроме этого, если вы хотите передать весь контент viewmodel в метод действия POST или использовать перенаправление с RedirectToAction()
после submэто, тогда вы должны использовать обычную форму отправки (с Html.BeginForm()
помощник) вместо.