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

时间:2013-02-28 08:15:51

标签: c# asp.net-mvc asp.net-mvc-3 data-annotations unobtrusive-validation

我有以下视图模型

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>
}

我在上面的模型中的Answer字段上设置了dataannotation,但是如果我以下面的方式生成视图,它在上面的视图中不适用

@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>
}

这里出了什么问题......

3 个答案:

答案 0 :(得分:1)

要启动这些验证规则,您需要使用EditorFor代替TextAreaFor

这是因为TextArea的验证存在一个突出问题,请参见此处:http://aspnet.codeplex.com/workitem/8576

答案 1 :(得分:1)

这是由于ASP.NET MVC3发布的jquery.validate.unobtrusive.js版本中的错误。 This answer是同一个bug,解决方法是升级到最新版本的jquery.validate.unobtrusive.js - 从MVC4项目中获取它或使用NuGet更新。

jquery.validate.unobtrusive.js脚本似乎没有版本号,所以如果你在脚本中搜索一个名为 escapeAttributeValue 的函数,那么这是一个脚本版本有这个错误修复。

错误修复中解决的问题是如何处理生成的标记,其中包含需要在jQuery选择器中转义的字符的名称属性。在这种情况下

<textarea cols="20" name="[0].Answer" rows="2"></textarea>

需要这个选择器

$('[name=\\[0\\]\\.Answer]')

答案 2 :(得分:0)

客户端DataAnnotation(验证)不适用于Html.TextAreaFor()帮助程序。

要使其工作,您必须使用[DataType(DataType.MultilineText)]属性修饰'Answer'属性。在视图中,使用Html.EditorFor()帮助程序而不是Html.TextAreaFor()帮助程序方法。

见类似的答案asp.net mvc TextAreaFor is not getting validated as a required field