ASP.NET MVC 2 服务器端验证用于 Ajax 表单。

3
我遇到了以下问题。我正在为网站开发一个表单,这个表单应该进行验证。我想使用本地的ASP.NET MVC 2验证功能,但遇到了困难。我有一个通过$.get加载并使用jQuery UI模态对话框显示的表单。我找到的所有示例都说明如何在简单表单中使用MVC验证并避免Ajax表单。
我可以为此表单启用客户端验证,但我需要正确处理服务器端验证。如何处理ajax表单的服务器端验证模型错误?
1个回答

1

当您将对象传回控制器时,必须在If ModelState.IsValid中包装代码。

以下是我编辑用户的简化版本。第一个“EDIT”将User对象发送到视图。第二个“EDIT”处理来自视图的POST请求。

Function Edit() As ActionResult
    ''# do stuff to populate your User
    Return View(User)
End Function

<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal user as User)
    If ModelState.IsValid Then
        ''# do your valid stuff
    Else
        ''# The posted form was not valid, send the user back
        Return View(user)
    End If
End Function

这是使用C#的同样内容

public ActionResult Edit()
{
    // do stuff to populate your User
    return View(User);
}

[AcceptVerbs(HttpVerbs.Post)]
public object Edit(User user)
{
    if (ModelState.IsValid) {
            // do your valid stuff
    } else {
        //'# The posted form was not valid, send the user back
        return View(user);
    }
}

编辑:

如果您想添加 AJAX 验证,只需添加以下内容。

    <% 
        Html.EnableClientValidation() ''# This is where all the magic happens.  It will build your clientside validation for you out of your MetaData.
        Using Html.BeginForm("Edit", "Users")
    %>

      <!-- all your markup crap -->
            <tr>
                <td>
                    <%: Html.LabelFor(Function(model) model.UserName)%></td>
                <td>
                    <%: Html.TextBoxFor(Function(model) model.UserName) %>
                    <%: Html.ValidationMessage("UserName", "*")%><br />
                </td>
            </tr>

      <!-- somewhere you'll want to add a Validation Summary of all your errors -->
      <%= Html.ValidationSummary("Oops!, please correct the errors...") %>


      <% End Using%>
      <!-- bottom of the page -->

          <script src="../../Assets/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
          <script src="../../Assets/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
          <script src="../../Assets/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>

编辑:

这里有一些使用 Ajax.BeginForm 渲染的信息
http://singulartechnologies.com/asp-net-mvc-ajax-beginform-sample-code
http://msdn.microsoft.com/en-us/library/dd381533.aspx
http://weblogs.asp.net/mikebosch/archive/2008/02/15/asp-net-mvc-submitting-ajax-form-with-jquery.aspx


请注意,VB代码已经通过转换器转换为C#代码...我的C#技能还不够好。 - Chase Florell
rockinthesixstring,感谢您的回复。这个解决方案对于非Ajax表单(即使用Html.BeginForm助手创建的表单)完美适用。但是我使用的是Ajax.BeginForm。如果模型无效,则表单不会更新以显示验证摘要区域中的错误信息给用户。 - lostaman
在你的示例中,表单与所有页面内容一起提交。这不是AJAX表单。我希望表单提交是使用ajax方式而不刷新整个页面(我使用Ajax.BeginForm助手方法构建此表单),因为我将表单显示在模态对话框中,并且需要做出决定是关闭它还是向用户显示服务器端验证错误信息。 - lostaman
Ajax表单的处理方式是相同的,只需发送PartialView而不是View。 - Chase Florell
你能详细解释一下吗?抱歉,我对ASP.NET MVC还比较新。 - lostaman
我同意lostaman的观点。我不明白你的例子如何解决“提交AJAX表单”的问题。我无法理解的部分是Ajax.BeginForm用于修改DOM。你给它一个InsertionMode和一个UpdateTargetId。但是当验证失败时,你正在重新发送已经存在的相同内容,但只替换其中的一部分,导致一些重复。我尝试通过标记示例视图来说明。http://screencast.com/t/NjM1MGNlM - Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接