如果控件是从列表视图模型生成的,则数据注释不起作用
本文关键字:数据 不起作用 注释 控件 列表 模型 视图 如果 | 更新日期: 2023-09-27 18:01:27
我有下面的视图模型
public class QuestionarrieAnswersViewModel
{
public long QuestionID { get; set; }
public string Question { get; set; }
[Required(ErrorMessage="required")]
[StringLength(255, ErrorMessage = "Maximum 255 characters are allowed.")]
public string Answer { get; set; }
}
和我在下面生成视图
@model List<BusinessLayer.Models.ViewModel.QuestionarrieAnswersViewModel>
@using (Ajax.BeginForm("SaveQuestionarrie", "Member", FormMethod.Post, new AjaxOptions { OnBegin = "OnBegin", OnComplete = "OnComplete" }, new { @class = "form-horizontal" }))
{
for(int i=0;i<Model.Count;i++)
{
<div class="control-group">
<div class="head_form">
<label class="control-label">@Model[i].Question</label>
<div class="controls">
@Html.TextAreaFor(m=>m[i].Answer)
@Html.ValidationMessageFor(m => m[i].Answer)
@Html.HiddenFor(m=>m[i].QuestionID)
</div>
</div>
</div>
}
<div class="control-group">
<div class="controls">
<button class="btn" type="submit">Save</button>
</div>
</div>
}
我在上面的模型中设置了答案字段的数据注释,但如果我以下面的方式生成视图,它不会在上面的视图中应用
@model BusinessLayer.Models.ViewModel.QuestionarrieAnswersViewModel
@using (Ajax.BeginForm("SaveQuestionarrie", "Member", FormMethod.Post, new AjaxOptions { OnBegin = "OnBegin", OnComplete = "OnComplete" }, new { @class = "form-horizontal" }))
{
@Html.TextAreaFor(m => m.Answer)
@Html.TextAreaFor(m => m.QuestionID)
<div class="control-group">
<div class="controls">
<button class="btn" type="submit">Save</button>
</div>
</div>
}
为了触发这些验证规则,您需要使用EditorFor
而不是TextAreaFor
。
这是因为TextArea
的验证有一个突出的问题,见这里:http://aspnet.codeplex.com/workitem/8576.
这是由于与ASP一起发布的jquery.validate.unobtrusive.js版本中的一个错误。净MVC3。这个答案是在同一个错误上,这个问题的解决方案是升级到最新版本的jquery.validate.unobtrusive.js -要么从MVC4项目中抓取它,要么使用NuGet更新。
jquery.validate.unobtrusive.js脚本似乎没有版本号,所以如果你在脚本中搜索一个名为escapeAttributeValue的函数,那么这个版本的脚本已经修复了这个错误。
在bug修复中解决的问题是如何处理在jQuery选择器中生成的具有包含需要转义的字符的名称属性的标记。在本例中
<textarea cols="20" name="[0].Answer" rows="2"></textarea>
需要这个选择器
$('[name=''[0'']''.Answer]')
客户端DataAnnotation(验证)对Html.TextAreaFor() helper不起作用。
要使它工作,你必须用[DataType(DataType. multilinetext)]属性装饰'Answer'属性。在视图中,使用Html.EditorFor()辅助方法,而不是Html.TextAreaFor()辅助方法。
参见类似的SO回答asp.net mvc TextAreaFor没有得到验证作为必填字段