Проверка правильности синтаксического анализа ответа JSON - PullRequest
1 голос
/ 13 декабря 2011

Я хотел бы знать, может ли кто-нибудь указать мне на учебник или дать мне представление о том, как я должен проверить модель и отобразить ее сообщения об ошибках, анализируя ответ json на клиенте.Я уверен, что это должно быть уже задано, но не смог найти вопрос.

0) Пользователь оставляет пустые обязательные поля.
1) Нажатие кнопки отправки.
2) Сообщение обрабатывается и вместо него выполняется запрос ajax.
3) Метод действия обрабатываетpost пытается связать модель с формой коллекции.Обнаруживает ошибки, поскольку обязательные поля пусты.
4) Возвращает ответ json, передавая объектную модель, которую он пытался связать.
5) Я хотел бы знать, как я могу проанализировать ответ json, поэтому, если я обнаружулюбые ошибки, такие как обязательное поле, я мог бы использовать сгенерированные теги данных и отображать соответствующее сообщение об ошибке.

Метод действия:

[AcceptVerbs(HttpVerbs.Post)]
    public JsonResult ValidateTrade(FormCollection data) {
        Trade addedGroup = new Trade ();
        try {
            UpdateModel(addedGroup);
        }
        catch (Exception ex) {
        }  return json(addedGroup);
    }

Javascript:

    $.ajax({
            url: link,
            type: "POST",
            data: form.serialize(),
            success: function (data) {
//Parse response so if I detect errors, like required field, make use of the data tags already generated by MVC, show the corresponding error message.
                },
                error: function (jqXhr, textStatus, errorThrown) {
                },
                complete: function () {
                }
            });

Вот мой .cshtml:

@Html.LabelFor(model => model.Trade.Name)
@Html.TextBoxFor(model => model.Trade.Name)
@Html.ValidationMessageFor(model => model.Trade.Name)

Сгенерированный html:

<label for="Trade_Name">Name:</label>
<input class="input-validation-error" data-val="true" data-val-required="Name requiered." id="Trade_Name" name="Trade.Name" type="text" value="" />
<span class="field-validation-error" data-valmsg-for="Trade.Name" data-valmsg-replace="true">Name requiered.</span>

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

MVC имеет разметку RemoteValidator, в которую можно добавить дополнительные свойства для отправки на сервер для проверки, но при этом создается только одно сообщение проверки.

В какой-то момент я пытался сделать то, что выпредполагают, что при отправке данных на сервер через AJAX, некоторой проверке, возвращении списка ошибок, отображении некоторых сообщений об ошибках.Я сделал это, чтобы создать собственный объект, который я использовал бы для всех моих ответов JSON.Вы можете расширить объект, включив в него массив или список пар имя / значение, которые позволят вам определить, в каких полях есть ошибки.

public class JSONResponseObject
{
    private bool m_Success;
    private string m_Redirect;
    private string m_Message;
    private object m_Data;

    public bool Success
    {
        get { return m_Success; }
        set { m_Success = value; }
    }
    public string Redirect
    {
        get { return m_Redirect; }
        set { m_Redirect = value; }
    }
    public string Message
    {
        get { return m_Message; }
        set { m_Message = value; }
    }
    public object Data
    {
        get { return m_Data; }
        set { m_Data = value; }
    }


    public JSONResponseObject(bool Success)
    {
        m_Success = Success;

        m_Redirect = null;
        m_Message = null;
        m_Data = null;
    }
    public JSONResponseObject(bool Success, object Data)
    {
        m_Success = Success;
        m_Data = Data;

        m_Redirect = null;
        m_Message = null;
    }

    public JSONResponseObject(string Redirect)
    {
        m_Success = true;
        m_Redirect = Redirect;

        m_Message = null;
        m_Data = null;
    }
    public JSONResponseObject(bool Success, string Message)
    {
        m_Success = Success;
        m_Message = Message;


        m_Redirect = null;
        m_Data = null;
    }
    public JSONResponseObject(bool Success, string Message, object Data)
    {
        m_Success = Success;
        m_Message = Message;
        m_Data = Data;

        m_Redirect = null;
    }

}

Это позволяет вам возвращать ответ клиенту и проверять свойства:

 $.ajax({
        type: "POST",
        dataType: 'json',
        url: "/woconnect/searchclients",
        data: "q=" + escape($('#searchTerm').val()) + "&clienttypeid=" + escape($('input[name="clienttypeid"]:checked').val()),
        success: function(response) {

            if (response.Success) {
             //do something with response.Data or response.Redirect
            }
            else
                alert(response.Message);

            $.unblockUI();
        },
        error: function() { $.unblockUI(); alert('An error occured and we were unable to load the clients'); }
    });

Самая большая проблема заключается в том, что вам придется написать валидацию внутри контроллеров, создавая зависимость между контроллерами и представлениями.Мне это не понравилось.Мой следующий проект использовал встроенную клиентскую проверку для MVC, которая использовала jQuery.Validate, как предложил rauland.При правильной настройке вы можете использовать одно действие, чтобы вернуть полное или частичное представление или даже ответ JSON, проверив Request.IsAjaxRequest ().Предстоит проделать большую работу, и я обнаружил, что сборка в валидации была самой простой вещью.

1 голос
/ 13 декабря 2011

Проверьте плагин jQuery Validate . Это позволяет вам устанавливать собственные правила. Вы можете назначить сгенерированные MVC классы для работы с методами проверки плагина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...