C# 根据模型验证Ajax.beginfom

C# 根据模型验证Ajax.beginfom,c#,ajax,asp.net-mvc,model,C#,Ajax,Asp.net Mvc,Model,我是ASP.NETMVC的新手 问题是 我有一个视图,其中列出了所有过滤器类型。在相同的视图中,我需要一个基于AJAX的搜索选项。我让ajax部分工作起来了。但是,如何使Ajax post针对用户性模型进行验证呢?。是否可以将视图的Ajax部分移动到partialView 非常感谢您的帮助 这是样品 @model IEnumerable<UserEntity> @using (Ajax.BeginForm("Index", "FiltrationType", new AjaxOpt

我是ASP.NETMVC的新手

问题是

我有一个视图,其中列出了所有过滤器类型。在相同的视图中,我需要一个基于AJAX的搜索选项。我让ajax部分工作起来了。但是,如何使Ajax post针对用户性模型进行验证呢?。是否可以将视图的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>
和控制器代码

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

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

此时我只能猜测,但最常见的解决方案是检查脚本是否包含在内

更新

另一个可能的原因如下:

问题很可能是因为您的模型是
IEnumerable
。因此,
HtmlHelper
(这是您用于呈现帮助程序的
Html
属性的类型)没有关于
UserEntity
验证规则的信息,并且呈现类型等于
text
的简单输入,而客户端验证不需要属性

这解释了服务器端验证工作的原因-您希望获得
UserSearch
实例作为操作方法的参数,因此现在应用了验证规则

其中一个可能的解决方案是使用内置验证在客户机上验证的属性扩展模型。例如,您可以使用以下模型

public class UserSearchResults : UserSearch
{
    public IEnumerable<UserEntity> Items { get; set; }
}
并更新局部视图的用法

@Html.Partial("_filtrationGrid", Model.Items)
使用上面的代码将告诉
HtmlHelper
它正在处理的模型以及应该应用的验证

在您的例子中,可能有一种更好的组合模型的方法,但主要的一点是,当呈现视图时,引擎不知道这些输入的值将被发布到一个操作方法,该方法期望获得
UserSearch
类实例,因此,它们被视为普通输入,没有附加验证


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


另外,最好将名为
cmdFilterationClear
的输入类型更改为
按钮,而不是
提交
,否则它可能仍会提交表单。

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

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


至于将ajax部分作为局部视图,您当然可以这样做。

也许您可以发布控制器代码?您在这里提交的似乎是一个字符串变量
SearchString
,您试图绑定哪种模型?感谢您的回复。我想绑定到UserEntity模型。这是我调试时的示例控制器[HttpPost][ValidateAntiForgeryToken]公共操作结果索引(string CmdFilterationSearch,string CmdFilterationClear,string SearchString,UserEntity entity){}。实体值为空。您还可以发布您的实体模型吗?我刚刚用更多信息更新了我的帖子。谢谢您的登录,我期待您的帮助。我已经更新了答案。请检查-我已在一个示例项目中尝试过此方法-使用MVC 4运行良好,我认为您正在使用。cmdUserSearch、cmdUserClear用于在控制器上检查用户单击的按钮。如果单击搜索,则从数据库中提取数据并填充。如果单击了cler,那么使用Jquery我将使所有文本框为空,并在控制器中填充表中的所有数据。同样,在生成UserSearchResults时也是如此。My UserSearh是UserEntity中的属性子集。我使用用户搜索表单中所需的属性创建了UserSearch类。在UserSearch类中,电子邮件不使用[Required]属性修饰,而在UserEntity中,电子邮件使用[Required]属性修饰。在表单中,如果我将电子邮件设置为@Html.EditorFor(model=>model.email)@Html.ValidationMessageFor(model=>model.email),然后单击submit.。表单显示“需要电子邮件”。是的,我在web.config中有此项。Jquery验证在其他视图中工作良好。
 <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)
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />