【问题标题】:Validating a list of objects - unobtrusively ASP.NET MVC 3 C#验证对象列表 - 不显眼的 ASP.NET MVC 3 C#
【发布时间】:2014-02-05 19:46:55
【问题描述】:

这看起来应该很容易实现,但我发现它具有挑战性。 我的视图模型中有一个对象列表,需要不显眼地进行验证。

我已经为此查看了 FluentValidation,但似乎 be a bug in the collections validation 实现不会触发不显眼的验证器。不确定是否有使用数据注释的方法 对于验证将不显眼(和服务器端)发生的对象列表

我正在寻找有关如何执行此操作的建议。谢谢

对象

public class NewClubSponsor
{
    public string SponsorContactName { get; set; }
    public string SponsorContactEmail { get; set; }
    public string SponsorContactPhone { get; set; }
 }

我在我的视图模型中声明了 NewClubSponsor 对象列表

 public List<NewClubSponsor> Sponsors { get; set; }

观点

<div id="addCosponsorSection">
    <!-- We have at least 1 existing sponsor -->
     @if (Model.Sponsors != null)
     {
         for (var i = 0; i < Model.Sponsors.Count; i++)
         {
             string sponsorDivId = "sponsorclubname" + i.ToString();
             string deleteLink = "<a class=\"icon delete cosponsor\" data-attr-divid=\""+@sponsorDivId+"\" data-attr-id=" + @Model.Sponsors[i].Id + "></a>";

             <div id="@sponsorDivId">
                 <div class="formColumn1"><label for="sponsorclubname1">Sponsor club name</label></div>
                 <div class="formColumn2">@Html.EditorFor(x => x.Sponsors[i].SponsorContactName)
                     <div class="messageBottom"> 
                         @Html.ValidationMessageFor(model => model.Sponsors[i].SponsorContactName)
                     </div>
                  </div>
                 <div class="formColumn3">@Html.EditorFor(x => x.Sponsors[i].SponsorContactEmail)
                        <div class="messageBottom"> 
                            @Html.ValidationMessageFor(model => model.Sponsors[i].SponsorContactEmail)
                        </div>
                 </div>
                 <div class="formColumn4">@Html.EditorFor(x => x.Sponsors[i].SponsorContactPhone)@(i > 0 ? Html.Raw(deleteLink) : Html.Raw(""))
                  <div class="messageBottom"> 
                            @Html.ValidationMessageFor(model => model.Sponsors[i].SponsorContactPhone)
                   </div>
                 </div>
             </div>
             <div class="clear"></div>

         }

     }
     else
     {
         <!-- No sponsors added yet. We need at least 1 sponsor -->
         <div id="sponsorclubname1">
             <div class="formColumn1"><label for="sponsorclubname1">Sponsor club name</label></div>

             <div class="formColumn2">@Html.EditorFor(model => model.Sponsors[0].SponsorContactName)
                 <div class="messageBottom"> 
                     @Html.ValidationMessageFor(model => model.Sponsors[0].SponsorContactName)
                 </div>
              </div>
             <div class="formColumn3">@Html.EditorFor(model => model.Sponsors[0].SponsorContactEmail)
                <div class="messageBottom"> 
                @Html.ValidationMessageFor(model => model.Sponsors[0].SponsorContactEmail)
              </div>
            </div>
             <div class="formColumn4">@Html.EditorFor(model => model.Sponsors[0].SponsorContactPhone)
                 <div class="messageBottom"> 
                     @Html.ValidationMessageFor(model => model.Sponsors[0].SponsorContactPhone)
                 </div>
              </div>
         </div>
         <div class="clear"></div>
         <!-- END Static HTML -->

     }
 </div>

【问题讨论】:

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


    【解决方案1】:

    您可以在组成列表的对象中添加数据注释。 这将添加 data-valid 和 requerire 属性...

    但是,如果列表是动态创建的,则在表单中添加新项目后需要绑定验证逻辑(如果通过 JS 添加)。

    【讨论】:

    • 您能举个例子吗?不太清楚你的意思。类对象的数据注释需要进入视图模型,而不是实际模型本身,因为并非该类的所有对象都需要。
    • 在您的 NewClubSponsor 类中,您应该放置数据注释。然后,有了你所拥有的并且已经包含了 jquery.validate.unobtrusive.js,它应该可以在客户端工作。
    • 我试图将注释保留在视图模型中,但似乎对于对象列表,它们需要进入域模型。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2011-06-28
    • 2011-09-20
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多