ASP.NET MVC 2 - 未出现某些验证错误

时间:2011-08-22 00:43:45

标签: validation asp.net-mvc-2 c#-4.0

我正在测试我的视图/编辑模型的数据注释,并且一些错误没有显示出来。它们都是属性级别的,但它们不会显示为属性级别或模型级别。他们根本就没有表现出来。

我的观点/编辑模式:

public class AdminGameEditModel
{
    [Required]
    public int GameID { get; set; }

    [Required(ErrorMessage="A game must have a title")]
    [DisplayFormat(ConvertEmptyStringToNull=false)]
    public string GameTitle { get; set; }

    [Required(ErrorMessage="A short URL must be supplied")]
    [DisplayFormat(ConvertEmptyStringToNull=false)]
    public string Slug { get; set; }

    [Required(ErrorMessage="A box art image must be supplied")]
    public HttpPostedFileBase BoxArt { get; set; }

    [Required(ErrorMessage="A large image for the index page is required")]
    public HttpPostedFileBase IndexImage { get; set; }

    [Required(ErrorMessage="A game must have a review")]
    [DisplayFormat(ConvertEmptyStringToNull=false)]
    public string ReviewText { get; set; }

    [Required(ErrorMessage="A game must have a score")]
    public int ReviewScore { get; set; }

    [Required(ErrorMessage="A game must have at least one Pro listed")]
    [DisplayFormat(ConvertEmptyStringToNull=false)]
    public string[] Pros { get; set; }

    [Required(ErrorMessage="A game must have at least one Con listed")]
    [DisplayFormat(ConvertEmptyStringToNull=false)]
    public string[] Cons { get; set; }

    [Required(ErrorMessage="A game must belong to a genre")]
    public int GenreID { get; set; }

    [Required(ErrorMessage="A game must be associated with at least one platform")]
    public int[] PlatformIDs { get; set; }
}

其验证似乎无法正常工作的属性是Pros,Cons和GenreID。以下是我在视图中尝试调用它们的方法:

<p>
    <%: Html.Label("Genre") %>
    <%: Html.ValidationMessageFor(model => Model.GameData.GenreID) %>
    <%: Html.DropDownListFor(m => Model.GameData.GenreID, new SelectList(Model.AllGenres, "GenreID", "Name", Model.GameData.GenreID)) %>
</p>

<p>
    <%: Html.LabelFor(model => Model.GameData.Pros) %><br />
    <%  for (var i = 0; i < 5; ++i)
        { %>
            <input type="text" name="GameData.Pros" value="<%: (Model.GameData.Pros[i] != null && String.IsNullOrEmpty(Model.GameData.Pros[i])) ? "" : Model.GameData.Pros[i] %>" /><br />
    <% } %>

    <%: Html.ValidationMessageFor(model => Model.GameData.Pros) %>
</p>

<p>
    <%: Html.LabelFor(model => Model.GameData.Cons) %><br />
    <%  for (var i = 0; i < 5; ++i)
        { %>
            <input type="text" name="GameData.Cons" value="<%: (Model.GameData.Cons[i] != null && String.IsNullOrEmpty(Model.GameData.Cons[i])) ? "" : Model.GameData.Cons[i] %>" /><br />
    <% } %>

    <%: Html.ValidationMessageFor(model => Model.GameData.Cons) %>
</p>

其余的都很好。我很难过为什么这三个人没有出现。作为原因,我没有看到任何跳出来的东西。我正在使用默认的模型绑定器和验证服务。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

嗯,对于初学者来说,你的输入字段没有id。模型验证不适用于名称,只适用于ID。但这只是问题的一部分。 Model Binder不太可能绑定到数组,因为数组是不可变的,这使得很难对它们进行迭代赋值。您将不得不重新考虑应用程序的这一部分。

其次,您的DropDownList没有默认值。在大多数情况下,它会选择第一个项目,因此无法使其无效。

您可能会发现this article很有趣。