Идея проверки AJAX - в комплекте с ValidationSummary & ValidationMessage - PullRequest
2 голосов
/ 21 мая 2009

Я рассматривал многие идеи проверки ASP.Net MVC на стороне клиента, включая xVal. В данный момент это не обеспечивает ValidationSummary, поэтому я решил сделать AJAX-пост, который просматривает ошибки ModelState и обновляет DIV сообщениями об ошибках в успешном AJAX-посте.

Проблема в том, что ваше ValidationMessage * рядом с полями заполняться не будет. У меня возникла альтернативная идея, которую я еще не опробовал, так как я не знаю полного синтаксиса, чтобы она заработала, но подумала, что увижу, что вы, ребята, думаете.

Одна проблема, которая, я думаю, может быть проблемой, заключается в том, что когда вы публикуете свой метод Edit / 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 Ответ

1 голос
/ 21 мая 2009

В моем текущем проекте 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);
    }
}

Это не будет соответствовать вашему сценарию из коробки, но вы можете сделать что-то подобное в качестве концепции. Надеюсь, что это, по крайней мере, дает вам некоторые идеи.

...