Идея проверки AJAX - в комплекте с ValidationSummary & ValidationMessage
Я смотрел на многие идеи валидации ASP.Net MVC на стороне клиента, включая xVal. В данный момент это не обеспечивает ValidationSummary, поэтому я решил сделать AJAX-пост, который просматривает ошибки ModelState и обновляет DIV сообщениями об ошибках в успешном AJAX-посте.
Проблема в том, что ваше ValidationMessage * рядом с полями не будет заполнено. У меня возникла альтернативная идея, которую я еще не опробовал, так как я не знаю полного синтаксиса, чтобы она заработала, но подумала, что увижу, что вы, ребята, думаете.
Я думаю, что одна проблема может заключаться в том, что когда вы публикуете метод Control /Create Action в контроллере и хотите вернуть объект JSON, я не уверен, что это допустимо, поскольку JSON используется только для действий GET.
Если вы считаете, что это хорошая идея и хотите помочь, пожалуйста, оставьте ответ и любые фрагменты кода, чтобы это работало. Если вы думаете, что это замысловатая схема и ее можно сделать лучше, пожалуйста, дайте мне знать, как это сделать.
контроллер:
if (!ModelState.IsValid)
{
var err = ModelState.Where(f => f.Value.Errors.Count > 0);
if (Request.IsAjaxRequest())
{
return this.Json(err);
}
else
{
return View(PostedItem);
}
}
Посмотреть:
$(function() {
$('#createForm').ajaxForm({
success:fillSummary
});
//click events
$('#btnSave').click( function(){
$('#createForm').submit();
});
function fillSummary(data)
{
//Loop through the modelstate errors returned
$.each(data)
{
//Append Summary DIV with error message
//Look for span with the ModelState key name and set it to visible
}
}
<div id="summary">
<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.")%>
</div>
<form action="<%=Url.Action("Create") %>" method="post" id="createForm">
<fieldset>
<div>
<label for="Title">Title:</label>
<%= Html.TextBox("Title",Model.Title) %>
<%= Html.ValidationMessage("Title", "*") %>
<span id="val_Title" style="display:none">*</span>
</div>
</form>
<input type="button" value="Save" id="btnSave" />
1 ответ
В моем текущем проекте ASP.NET MVC у меня есть много действий POST, которые я использую для AJAX, и столкнулся с проблемой проверки. Я создал объект-обертку, который возвращается из каждого из этих действий и выглядит примерно так...
public class JsonWrapper
{
public object Data { get; set; }
public bool IsError { get; set; }
public string Message { get; set; }
}
Если проверка в действии не содержит каких-либо ошибок, я помещаю любые данные, которые я хочу вернуть, в свойство Data. Однако, если есть какая-либо ошибка проверки или другое исключение, я устанавливаю флаг IsError в true и устанавливаю сообщение об ошибке в свойстве Message. Затем в конце действия я сериализую объект в JSON и возвращаю его (да, вы можете сделать это из действия POST)...
return Json(myJsonWrapper);
Со стороны клиента, в onSuccess моего кода AJAX POST, я проверяю ошибки и предпринимаю любые необходимые действия, как это... (Обратите внимание, что на данный момент в коде объект, который был возвращен с сервера, уже был десериализуется в JS-объект с помощью jQuery)
function onSuccess(jsonWrapper) {
if (!jsonWrapper.IsError) {
var myDataFromAction = jsonWrapper.Data;
//Do stuff with my data
}
else {
MessageBox.ShowMessage(jsonWrapper.Message);
}
}
Это не будет соответствовать вашему сценарию из коробки, но вы можете сделать что-то подобное в качестве концепции. Надеюсь, что это, по крайней мере, дает вам некоторые идеи.