【问题标题】:MVC 3 client-side validation on collection with data annotations -- not working使用数据注释对集合进行 MVC 3 客户端验证 - 不起作用
【发布时间】:2023-04-06 15:37:02
【问题描述】:

我正在尝试让客户端验证在我的模型上工作 - 到目前为止它不起作用。

我的模型有一个集合属性:

public class NewsEventsModel
{
    public List<NewsItemDetails> newsItems { get; set; }
    public int pageNumber { get; set; }
    public int totalPages { get; set; }
    public bool canManageNews { get; set; }
    public long userID { get; set; }
}

NewsItemDetails 是这样定义的:

public class NewsItemDetails
{
    public long itemID { get; set; }

    public long postedByID { get; set; }

    public DateTime datePosted { get; set; }

    [Required(ErrorMessage = "Please enter news or event text")]
    [StringLength(100)]
    [RegularExpression(RegExpressions.freeTextRestrict)]
    public string newsBody { get; set; }

    [StringLength(50)]
    [RegularExpression(RegExpressions.freeTextRestrict)]
    public string newsTitle { get; set; }
}

我将 NewsEventsModel 发送到视图。然后在我看来,我包括

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>  

然后在我的视图代码中

   for (int j = 0; j < Model.newsItems.Count(); j++)
   {

      /// bunch of stuff
      // then:
     <div class="editblock">
       @Html.TextAreaFor(model => model.newsItems[j].newsBody, new { @class = "formtextem", id = editBoxID, rows = "10", style = "width: 54em" })
       @Html.ValidationMessageFor(model => model.newsItems[j].newsBody)
     </div> 
   } 

但是当我删除文本区域中的所有文本并单击保存时,“必填”消息不会出现..当我违反任何其他规则时也不会出现任何消​​息。

但是,如果我将验证注释放在顶级 NewsEventsModel 中的属性之一上,然后将其作为文本框包含在视图中,则客户端验证确实有效。它只是不适用于较低级别的 NewsItemDetails 类。

我在这里错过了什么?

【问题讨论】:

    标签: jquery asp.net-mvc asp.net-mvc-3 validation data-annotations


    【解决方案1】:

    尝试在您的视图中使用编辑器模板:

    @Html.EditorFor(x => x.newsItems)
    

    ~/Views/Shared/EditorTemplates/NewsItemDetails.cshtml内部:

    @model AppName.Models.NewsItemDetails
    
    // bunch of stuff
    // then:
    <div class="editblock">
        @Html.TextAreaFor(model => model.newsBody, new { @class = "formtextem", id = editBoxID, rows = "10", style = "width: 54em" })
        @Html.ValidationMessageFor(model => model.newsBody)
    </div> 
    

    【讨论】:

    • 成功了!到目前为止,我还没有研究过模板,但现在我会研究它们,因为我看到了它们有多么强大。谢谢!
    • 我唯一需要改变的是使用@Html.EditorFor(x => x.newsItems[j])——因为它在一个循环中。否则,MVC 每次通过循环都会为集合中的所有项目生成文本框(我一开始没有注意到,因为它们在用户单击编辑之前是隐藏的)。但在其他情况下,这可能是一个理想的结果——很高兴知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多