如果控件是从列表视图模型生成的,则数据注释不起作用

本文关键字:数据 不起作用 注释 控件 列表 模型 视图 如果 | 更新日期: 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没有得到验证作为必填字段