1

我有以下视图模型数据注释如果从控制列表视图模型生成不不行

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

我已经设置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> 
} 

这里发生了什么...

+0

你实际上调用'ModelState.IsValid'? – mattytommo 2013-02-28 08:20:13

+0

验证甚至不在客户端工作。 – 2013-02-28 08:21:18

+0

出于兴趣,改变你的'按钮'提交到'input type =“submit”'这有什么区别吗? – mattytommo 2013-02-28 08:22:45

回答

1

为了启动这些验证规则,您需要使用EditorFor而不是TextAreaFor

这是因为在验证TextArea的时候有一个未解决的问题,请看这里:http://aspnet.codeplex.com/workitem/8576

+0

您还可以让我知道它如何与编辑器一起工作,但它不能与TextBoxFor或带有列表视图模型的TextAreaFor一起使用? – 2013-02-28 09:21:03

+0

@JitendraPancholi添加了一个链接,它基本上是MVC验证中的一个突出问题 – mattytommo 2013-02-28 09:21:45

0

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

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

查看相似的回答asp.net mvc TextAreaFor is not getting validated as a required field

+0

它的作品完美没有任何装饰。我也提到过我的问题。 – 2013-02-28 08:56:52

+0

即使我将它从TestAreaFor更改为TextBoxFor,它也不会起作用。 – 2013-02-28 09:02:01

+0

我已经提到使用Html.EditorFor()而不是Html.TextAreaFor() – Kibria 2013-02-28 09:28:00

1

这是由于随ASP.NET MVC3发布的jquery.validate.unobtrusive.js版本中的错误。 This answer也存在相同的问题,解决方案是升级到最新版本的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]') 
相关问题