В MVC, как определить, был ли ответ частичного представления действительным (на стороне клиента)? - PullRequest
3 голосов
/ 11 ноября 2011

Я новичок в MVC, так что, надеюсь, мой вопрос будет прямым. Я имею в виду сценарий, когда пользователь отправляет форму (это частичное представление), и она проходит проверку сервера. Мне интересно, как я узнаю результат проверки на стороне клиента (javascript) после отправки формы. Например, если проверка не удалась, я, очевидно, захочу вернуть частичное представление снова с установленными сообщениями проверки, но если оно проходит проверку, я не обязательно хочу возвращать частичное представление. Я могу захотеть вернуть объект json с сообщением или скрыть div или что-то еще. Я хочу иметь возможность определить результат проверки на клиенте. Возможно ли что-то подобное? Или я могу подойти к этому по-другому?

Ответы [ 3 ]

3 голосов
/ 11 ноября 2011

Сложность работы с AJAX заключается в том, что клиент и сервер должны согласовать то, что предполагается возвращать с сервера при любых обстоятельствах. У вас есть несколько вариантов:

  1. Ваш сервер всегда будет возвращать HTML, а jQuery всегда будет заменять содержимое редактора возвращаемым HTML. Если модель недействительна, вы возвращаете результат PartialView. Если модель действительна, вы возвращаете тег <script>, который сообщает странице, что ей нужно сделать (например, закрыть диалог, перенаправить на другую страницу и т. Д.). jQuery автоматически запускает любой скрипт, который он находит в результатах, когда он пытается вставить их в DOM.
  2. Ваш сервер всегда будет возвращать объект JSON, представляющий, что произошло. В этом сценарии ваш JavaScript-код на стороне клиента должен быть достаточно сложным, чтобы получать результаты и изменять вашу страницу в соответствии. В обычных условиях это будет означать, что вы не сможете воспользоваться функциями проверки MVC.
  3. То же, что и 2, за исключением того, что вы используете собственный служебный метод для рендеринга нужного вам частичного представления в строку и делаете всю эту строку частью возвращаемого JSON. Тогда код javascript должен быть достаточно умным, чтобы проверить, показывает ли JSON действительный или недействительный результат, и, если результат действительный, замените содержимое области редактора на HTML-код частичного просмотра, который возвращается как часть объекта JSON, который вы вернулся.
  4. То же, что и 3, за исключением того, что вы разрабатываете архитектуру на основе событий, в которой все ваши запросы AJAX всегда будут ожидать возвращения объекта JSON с одним или несколькими «событиями» в нем. Затем код AJAX можно объединить в один метод, который передает события в шину событий. Шина событий затем передает информацию о событиях в обратные вызовы, которые «подписались» на эти события. Таким образом, в зависимости от того, какие события вы возвращаете с сервера, вы можете выполнять различные действия на стороне клиента. Эта стратегия требует намного больше предварительной работы, но когда она будет выполнена, вы можете иметь гораздо больше гибкости, и код на стороне клиента станет значительно более удобен в обслуживании.
2 голосов
/ 15 января 2012

Частичные виды не будут иметь страницу макета. Вы можете использовать этот код, чтобы проверить, отображается ли представление как частичное представление.

@if (String.IsNullOrWhiteSpace(Layout))
{
  // Do somthing if it is partial view
}
else
{
     // Do somthing if it is full page view
}
0 голосов
/ 11 ноября 2011

Если вы используете аннотации данных MVC для проверки вашей модели, то у контроллера будет свойство с именем ModelState (typeof (ModelStateDictionary) , которое в качестве свойства IsValid определяет, передана ли ваша модель в контроллер / Действие допустимо.

С помощью IsValid вы можете вернуть объект Json, который может сообщить вашему Javascript, что делать дальше.

Обновление

Вот действительно простой пример (ИСПОЛЬЗУЕТ jQuery):

[SomeController.cs]
public class SomeController : Controller
{
    public ActionResult ShowForm()
    {
        return View();
    }
    public ActionResult ValidateForm(MyFormModel FormModel)
    {
        FormValidationResults result = new FormValidationResults();
        result.IsValid = ModelState.IsValid;
        if (result.IsValid)
        {
            result.RedirectToUrl = "/Controller/Action";
        }
        this.Json(result);
    }
}

[FormValidationResult.cs]
public class FormValidationResults
{
    public bool IsValid { get; set; }
    public string RedirectToUrl { get; set; }
}

[View.js]
$(document).ready(function()
{
    $("#button").click(function()
    {
        var form = $("#myForm");
        $.ajax(
        {
            url: '/Some/ValidateForm',
            type: 'POST',
            data: form.serialize(),
            success: function(jsonResult)
            {
                if (jsonResult.IsValid)
                {
                    window.location = jsonResult.RedirectToUrl;
                }
            }
        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...