如何在保持ModelState错误的同时使用MVC ajax和PartialViews

时间:2011-05-20 23:39:50

标签: jquery ajax asp.net-mvc-3 partial-views modelstate

我正在使用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 />

我的Controller Action方法就像这样

    [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错误返回View?

在我提供的链接中,讨论了返回带有状态代码的json,以便客户端可以检测错误与成功条件(即RenderPartialViewToString)。但我真的不明白这一切是如何被钩住/消耗的。

e.g。如果成功,只显示局部视图?如果错误,我们只是使用更新的ModelState刷新页面吗?有人可以将各个部分链接在一起并显示一个端到端的示例,即View / jquery ajax调用吗?

除此之外:作为一种替代实现,我使用类似于这种方法的东西,并使其工作,但我不知道......它似乎是错误的,因为我刷新的页面比我想要的更多成功案例。

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

e.g。我的控制器看起来像这样,我的PartialViews现在包含成功和错误版本中的“表单”代码。

    [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 :(得分:0)

我也有这个问题,解决方案在这里完成了工作。它很简单:诀窍是在AjaxOptions中的UpdateTargetId中包含表单本身: http://xhalent.wordpress.com/2011/02/05/using-unobtrusive-ajax-forms-in-asp-net-mvc3/

答案 1 :(得分:0)

你非常接近。 以下是控制器的外观:

[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是否有效,您都会使用相同的模型返回相同的视图。唯一的区别是,如果它有效,您可能需要做一些额外的操作。

为了显示错误,您需要将一个片段添加到View中,以显示错误。但是,Html.ValidationSummaryHtml.ValidationMessageHtml.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 />