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

发布于 2024-11-30 11:34:19 字数 2947 浏览 2 评论 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>

其余的都显示得很好。我很困惑为什么这三个人没有出现。我不认为有什么原因是我突然想到的。我正在使用默认的模型绑定器和验证服务。

有什么想法吗?

I'm testing my view/edit model's Data Annotations, and some of the errors aren't showing up. They're all property-level, but they're not showing up as either property-level or model-level. They're simply not showing up at all.

My view/edit model:

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

The properties whose validation doesn't seem to be working properly are Pros, Cons, and GenreID. Here's how I'm trying to invoke them in my view:

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

The rest all show up fine. I'm stumped as to why those three aren't appearing. I don't see anything that jumps out to me as the cause. I'm using the default model binder and validation service.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

jJeQQOZ5 2024-12-07 11:34:19

好吧,对于初学者来说......你的输入字段没有 id。模型验证不适用于名称,仅适用于 id。但这只是问题的一部分。模型绑定器不太可能绑定到数组,因为数组是不可变的,这使得对它们进行迭代分配变得困难。您将不得不重新考虑申请的这一部分。

其次,您的 DropDownList 没有默认值。在大多数情况下,它只会选择第一项,因此它不可能无效。

您可能会发现这篇文章很有趣。

Well, for starters.. your input fields have no id's. Model validation doesn't work with names, only id's. But that's only part of the problem. The Model Binder is unlikely to be able to bind to arrays because arrays are immutable, this makes it hard to do iterative assignment to them. You're going to have to rethink this part of your application.

Second, your DropDownList has no default value. It will, in most cases just select the first item so there is no way for it to not be valid.

You may find this article interesting.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文