Ajax.BeginForm验证模型

时间:2013-12-18 21:04:54

标签: c# ajax asp.net-mvc model

我是ASP.Net MVC的新手..

这是问题......

我有一个列出所有FilterTypes的View。在同一个View ..我需要一个基于AJAX的搜索选项。我得到了ajax部分工作。但是如何使Ajax帖子针对UserEnity模型进行验证?是否可以将视图的Ajax部分移动到partialView?。

非常感谢任何帮助。

这是样本

@model IEnumerable<UserEntity>

@using (Ajax.BeginForm("Index", "FiltrationType", new AjaxOptions
    {
        HttpMethod = "post",
        UpdateTargetId = "gridContent",
        InsertionMode = InsertionMode.Replace }))
    {
        @Html.AntiForgeryToken();
        @Html.ValidationSummary(true)
        <p> <b>Search Filter Type </b> @Html.TextBox("SearchString") <br />   
        <input type="submit" name="cmdFiltrationSearch" value="Search" /> 
        <input type="submit" name="cmdFiltrationClear" value="Clear" onclick="ClearFiltrationTypeSearchText()" /> 
        </p>     
    }

<div id="gridContent">

   @if (ViewBag.DataRetriveStatus != null )
   {
     <span class ="ErrorDiv"> @ViewBag.DataRetriveStatus </span><br />
   }
   else
   {
   @Html.Partial("_filtrationGrid", Model)
   }
</div>

好消息是,在将表格名称与模型实体名称列表匹配后,我无法发布模型数据。

@using (Ajax.BeginForm("Index", "User", new AjaxOptions
{
    HttpMethod = "post",
    UpdateTargetId = "gridContent",
    InsertionMode = InsertionMode.Replace }))    {
    @Html.AntiForgeryToken();
    @Html.ValidationSummary(true)
    <table class ="UserSearch">
        <tr> 
            <th> Account </th>
            <td>@Html.TextBox("DisplayName")
             </td>
        </tr>
          <tr> 
            <th> First Name</th>
            <td>@Html.TextBox("FirstName")  </td>
        </tr>
          <tr> 
            <th> Last Name </th>
            <td>@Html.TextBox("LastName")  </td>
        </tr>
    </table>
    <p>   
    <input type="submit" name="cmdUserSearch" value="Search" /> 
    <input type="submit" name="cmdUserClear" value="Clear" onclick="ClearUserSearchText()" /> 
    </p>     
}

但是jquery验证在表单上不起作用..想法为什么?但是在控制器中验证ModelState.IsValid可以正常工作。

这是我的实体模型

public class UserSearch
{
    [Required(ErrorMessage = "Display Name is Required")]
    [StringLength(30, MinimumLength = 2, ErrorMessage = "Display Name length should be between 2 and 30 characters")]
    [Display(Name = "Display Name")]
    public string DisplayName { get; set; }

    [Required(ErrorMessage = "First Name is Required")]
    [StringLength(30, MinimumLength = 2, ErrorMessage = "First Name length should be between 2 and 30 characters")]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name is Required")]
    [StringLength(30, MinimumLength = 2, ErrorMessage = "Last Name length should be between 2 and 30 characters")]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }
}

和contorller代码......

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(string cmdUserSearch, string cmdUserClear,  UserSearch entity)
{

   if (ModelState.IsValid) 
   {
     // some code
   }
}

2 个答案:

答案 0 :(得分:0)

此时我可以猜测,但最常见的解决方案是检查是否包含jquery.validate.unobtrusive-ajax脚本。

<强>更新

下面是另一个可能的原因:

最有可能出现问题,因为您的模型是IEnumerable<UserEntity>。因此,HtmlHelper<IEnumerable<UserEntity>>(您用于呈现帮助程序的Html属性的类型)没有关于UserEntity验证规则的信息,并且呈现类型等于{{的简单输入1}}没有客户端验证所需的属性。

这解释了为什么服务器端验证有效 - 您期望将text实例作为操作方法的参数,因此现在应用了验证规则。

可能的解决方案之一是使用内置验证扩展您希望在客户端验证的属性的模型。例如,您可以使用以下模型。

UserSearch

public class UserSearchResults : UserSearch { public IEnumerable<UserEntity> Items { get; set; } } 必须更改为我们的新@model课程。 您必须更新控制器才能将UserSearchResults传递到视图中。 并将以下更改添加到剃须刀中。

UserSearchResults

并更新部分视图的使用。

 <table class ="UserSearch">
    <tr> 
        <th> Account </th>
        <td>@Html.TextBoxFor(x => x.DisplayName)</td>
    </tr>
    <tr> 
        <th> First Name </th>
        <td>@Html.TextBoxFor(x => x.FirstName)</td>
    </tr>
    <tr> 
        <th> Last Name </th>
        <td>@Html.TextBoxFor(x => x.LastName)</td>
    </tr>
</table>

使用上面的代码会告诉@Html.Partial("_filtrationGrid", Model.Items) 它正在处理哪个模型,并且应该应用验证。

在你的情况下,可能有一种更好的组合模型的方法,但主要的一点是,当渲染视图时,引擎不知道这些输入的值将被发布到期望获得的动作方法HtmlHelper类实例,因此它们被视为普通输入而没有附加验证。


这与问题无关,但我想知道你为什么在行动方法UserSearch中有这些参数。根据您问题中的代码,这些代码始终等于string cmdUserSearch, string cmdUserClear

同样最好将名称为null的输入类型更改为cmdFiltrationClear而不是button,否则可能仍会提交表单。

答案 1 :(得分:0)

您的web.config文件是否设置了这些值并为true?

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

至于将ajax部分包含为局部视图,你当然可以做到这一点。