Получить модель в фильтре атрибутов проверки ajax
У меня есть представление, которое анализирует модель представления, это содержит две модели, одна из которых - ForgottenLoginModel. Я пытаюсь сделать AJAX-сообщение для контроллера и проверить его по модели через ValidateAjaxAttribute, который я нашел в Интернете.
Итак, мой вопрос:
Поскольку я не думаю, что ValidateAjaxAttribute может найти модель, чтобы выяснить, является ли модель действительной, как я могу настроить ValidateAjaxAttribute, чтобы найти правильную модель, может ли она каким-то образом получить ее из аргументов метода действия?
модель:
public class ForgottenLoginModel
{
[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
}
методы действия контроллера:
public ActionResult LoginDisplay()
{
LoginPartialViewModel modelCollection = new LoginPartialViewModel();
modelCollection.mLogin = new LoginModel();
modelCollection.mForgottenLogin = new ForgottenLoginModel();
return PartialView("_LoginDisplay", modelCollection);
}
[HttpPost]
[ValidateAjax]
public JsonResult SendUserCredentials(ForgottenLoginModel data)
{
bool l_result = false;
l_result = FindUserByEmail();
return Json(new { result = l_result }, JsonRequestBehavior.AllowGet);
}
HTML:
@model Nuclei.ViewModels.LoginPartialViewModel
<div id="ForgotLogin" class="box" style="border: none;">
@using (Html.BeginForm("SendUserCredentials", "Login", FormMethod.Post, new { id = "ForgotLoginForm" }))
{
@Html.AntiForgeryToken()
<div class="form-group">
<label class="control-label" style="color:white;">
@Html.DisplayNameFor(model => model.mForgottenLogin.Email)
</label>
@Html.EditorFor(model => model.mForgottenLogin.Email, new { htmlAttributes = new { id = "txtEmail", @class = "form-control" } })
@Html.ValidationMessageFor(model => model.mForgottenLogin.Email, "", new { @class = "text-danger" })
</div>
<div class="text-center" style="margin-top:40px;">
<input type="button" id="BackToLoginBtn" value="Back" class="btn btn-default" />
<input type="button" id="ForgotSubmitBtn" value="Submit" class="btn btn-primary" />
</div>
}
</div>
сценарий:
<script>
$(document).ready(function () {
function showForgottenProcessing(form) {
var frmValues = form.serialize();
$.ajax({
type: form.attr('method'),
url: form.attr('action'),
data: frmValues,
success: function (data) {
if (data.result == false) {
//Show error couldn't find an account with the email address
showForgotLoginForm();
}
else {
//On success go to the login form
showManualForm();
}
},
error: function (data) {
//Show errors if BadRequest else show error as dialog
}
});
}
$("#ForgotSubmitBtn").click(function () {
showForgottenProcessing();
e.preventDefault();
});
})
</script>
Фильтр атрибутов:
public class ValidateAjaxAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAjaxRequest())
return;
var modelState = filterContext.Controller.ViewData.ModelState;
if (!modelState.IsValid)
{
var errorModel =
from x in modelState.Keys
where modelState[x].Errors.Count > 0
select new
{
key = x,
errors = modelState[x].Errors.
Select(y => y.ErrorMessage).
ToArray()
};
filterContext.Result = new JsonResult()
{
Data = errorModel
};
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
}
}
}