Как использовать MVC ajax и PartialViews при сохранении ошибок ModelState - PullRequest
2 голосов
/ 21 мая 2011

Я использую MVC3.У меня есть форма, которая при отправке возвращает PartialView, который обновляет мою страницу.Вопрос / проблема заключается в том, как показать ошибки ModelState и сохранить значения моей формы в такте при возникновении ошибки?

Кажется, этот вопрос задавался ранее (см. Ссылки ниже), но яеще не нашли полного ответа / решения, но я в замешательстве ...

Моя очень простая модель

public class TEST_AjaxFormViewModel
{
    [Required]
    [StringLength(10)]
    public string Name { get; set; }
}

Мой взгляд выглядитвот так:

        <% using (Ajax.BeginForm("TEST_AjaxForm", new AjaxOptions { UpdateTargetId = "formResults" }))
           {%>

            <%:Html.ValidationSummary(true, "Please correct errors:")%>

            <div class="editor-label">
                <%:Html.LabelFor(model => model.Name)%>
            </div>
            <div class="editor-field">
                <%:Html.TextBoxFor(model => model.Name)%>
                <%:Html.ValidationMessageFor(model => model.Name)%>
            </div>
            <br />

            <div class="editor-label"></div>
            <div class="editor-field">
                <button name="button" type="submit" value="Submit">
                    Submit
                </button>
            </div>
            <br />

        <% }%>

        <div id="formResults" style="border: 1px dotted red; margin: 2.0em; padding: 1.0em;">
            <p>This is where my partial view will go</p>
        </div>

А мой PartialView просто выплевывает вывод:

            <div class="editor-label"></div>
            <div class="editor-field">
                <%: Model.Name %>
            </div>
            <br />

И мой метод действия контроллера вот так

    [HttpPost]
    public ActionResult TEST_AjaxForm(TEST_AjaxFormViewModel model)
    {
        if (ModelState.IsValid)
        {   
            return PartialView("TEST_AjaxFormPartialView", model);
        }
        //else
        return View(model);  // this is wrong! what should I return instead?
    }

Вопрос в том, каквернуть обратно представление с ошибками ModelState?

В предоставленных мною ссылках говорится о возврате json с кодами состояния, чтобы на стороне клиента можно было обнаружить ошибку или условие успеха (т. Е. RenderPartialViewToString).Но я не очень понимаю, как все это подключается / потребляется.

Например, в случае успеха, просто отобразить частичное представление?Если ошибка, мы просто обновить страницу с обновленным ModelState?Может кто-нибудь связать воедино кусочки и показать сквозной пример, а именно вызовы ajax View / jquery?

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

http://jvance.com/blog/2010/02/20/MakingAnAjaxFormWithJQueryInASPdotNETMVC.xhtml

например, Мой контроллервыглядит так, где мои PartialViews теперь содержат мой код "формы" в версиях Success и Error.

    [HttpPost]
    public ActionResult TEST_AjaxFormSingleMasterDiv(TEST_AjaxFormViewModel model)
    {
        if (ModelState.IsValid)
        {   // no model state errors
            return PartialView("TEST_AjaxFormSingleMasterDivPartialView_Success", model);
        }
        // else, error
        return PartialView("TEST_AjaxFormSingleMasterDivPartialView_Error", model);
    }

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 июня 2012

Вы очень близки.Вот как должен выглядеть ваш контроллер:

[HttpPost]
public ActionResult TEST_AjaxForm(TEST_AjaxFormViewModel model)
{
    if (ModelState.IsValid)
    {
        // perhaps do some additional actions? Save data to DB?
        return PartialView("TEST_AjaxFormPartialView", model);
    }
    //else
    return PartialView("TEST_AjaxFormPartialView", model);
}

Как вы можете видеть, является ли ваш ModelState действительным или нет, вы возвращаете то же представление с той же моделью.Единственное отличие состоит в том, что если он действителен, возможно, вы захотите выполнить некоторые дополнительные действия.

Чтобы отобразить ошибки, вам необходимо добавить фрагмент в представление, где будут отображаться ошибки.Однако Html.ValidationSummary или Html.ValidationMessage или Html.ValidationMessageFor должны быть внутри формы для рендеринга.Вот ваш взгляд:

@model [namespace].TEST_AjaxFormViewModel

<%: Html.BeginForm() %>
<div><%: Html.ValidationSummary() %></div>
<div class="editor-label"></div>
<div class="editor-field">
    <%: Model.Name %>
</div>
<%: Html.EndForm() %>
<br />
0 голосов
/ 06 июля 2011

У меня также была эта проблема, и решение здесь сделало свою работу.все очень просто: хитрость заключается в том, чтобы содержать саму форму внутри UpdateTargetId в AjaxOptions: http://xhalent.wordpress.com/2011/02/05/using-unobtrusive-ajax-forms-in-asp-net-mvc3/

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