Ajax.BeginFrom 验证模型
本文关键字:模型 验证 BeginFrom Ajax | 更新日期: 2024-10-29 18:11:58
我是MVC新手 ASP.Net。
这是问题所在...
我有一个列出所有过滤器类型的视图。在同一个视图中..我需要有一个基于 AJAX 的搜索选项。 我让 ajax 部分工作了。但是我怎样才能使 Ajax 帖子针对 UserEnity 模型进行验证?将视图的 Ajax 部分移动到部分视图是否可行?
任何帮助将不胜感激。
这是示例
@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; }
}
和连接代码...
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(string cmdUserSearch, string cmdUserClear, UserSearch entity)
{
if (ModelState.IsValid)
{
// some code
}
}
您的 web.config 文件是否将这些值设置为 true?
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
至于将 ajax 部分作为部分视图包含在内,您当然可以这样做。
在这一点上,我只能猜测,但最常见的解决方案是检查是否包含jquery.validate.unobtrusive-ajax脚本。
更新
另一个可能的原因如下:
出现此问题很可能是因为您的模型IEnumerable<UserEntity>
。因此,HtmlHelper<IEnumerable<UserEntity>>
(即用于呈现帮助程序的 Html
属性的类型)没有关于UserEntity
验证规则的信息,并且呈现类型等于 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
而不是 submit
,否则它仍然可能提交表单。