ASP.NET MVC:访问视图上的 ViewModel 属性

发布于 2024-12-05 14:12:57 字数 730 浏览 0 评论 0原文

有什么方法可以从视图访问 ViewModel 属性上的任何属性(无论是数据注释属性、验证属性还是自定义属性)?我想在其属性具有 [Required] 属性的字段旁边添加一些必填指示符。

例如,如果我的 ViewModel 如下所示:

public class MyViewModel
{
    [Required]
    public int MyRequiredField { get; set; } 
}

我想在 EditorFor 模板中执行以下操作:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<int?>" %>

<div class="label-container">
    <%: Html.Label("") %>

    <% if (PROPERTY_HAS_REQUIRED_ATTRIBUTE) { %>
        <span class="required">*</span>
    <% } %>
</div>
<div class="field-container">
    <%: Html.TextBox("") %>
    <%: Html.ValidationMessage("") %>
</div>

Is there any way to access any attributes (be it data annotation attributes, validation attributes or custom attributes) on ViewModel properties from the view? One of the things I would like to add a little required indicator next to fields whose property has a [Required] attribute.

For example if my ViewModel looked like this:

public class MyViewModel
{
    [Required]
    public int MyRequiredField { get; set; } 
}

I would want to do something in the EditorFor template like so:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<int?>" %>

<div class="label-container">
    <%: Html.Label("") %>

    <% if (PROPERTY_HAS_REQUIRED_ATTRIBUTE) { %>
        <span class="required">*</span>
    <% } %>
</div>
<div class="field-container">
    <%: Html.TextBox("") %>
    <%: Html.ValidationMessage("") %>
</div>

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

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

发布评论

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

评论(2

一场春暖 2024-12-12 14:12:57

您要查找的信息位于 ViewData.ModelMetadata 中。 Brad Wilson 关于模板的 博客文章系列 应该解释这一切,特别是 模型元数据

至于其他 ValidationAttributes,您可以通过 ModelMetadata.GetValidators() 方法。

ModelMetadata.IsRequired 会告诉您 RequiredAttribute 是否需要复杂类型(或包装在 Nullable 中的值类型),但它将为您提供不可为空的值类型的误报(因为它们是隐式必需的)。您可以通过以下方法解决此问题:

bool isReallyRequired = metadata.IsRequired 
    && (!metadata.ModelType.IsValueType || metadata.IsNullableValueType);

注意:您需要使用 !metadata.ModelType.IsValueType 而不是 model.IsComplexType,因为 ModelMetadata.IsComplexType code> 返回 false,因为 MVC 不认为是复杂类型,其中包括字符串。

The information you're looking for is in ViewData.ModelMetadata. Brad Wilson's blog post series on Templates should explain it all, especially the post on ModelMetadata.

As far as the other ValidationAttributes go, you can access them via the ModelMetadata.GetValidators() method.

ModelMetadata.IsRequired will tell you if a complex type (or value type wrapped in Nullable<T>) is required by a RequiredAttribute, but it will give you false positives for value types that are not nullable (because they are implicitly required). You can work around this with the following:

bool isReallyRequired = metadata.IsRequired 
    && (!metadata.ModelType.IsValueType || metadata.IsNullableValueType);

Note: You need to use !metadata.ModelType.IsValueType instead of model.IsComplexType, because ModelMetadata.IsComplexType returns false for MVC does not consider to be a complex type, which includes strings.

七月上 2024-12-12 14:12:57

我建议不要这样做,因为您在视图中添加逻辑,这是一种不好的做法。
为什么不创建一个HtmlHelper或者LabelExtension,你可以在方法内部调用ModelMetaProvider并查看该属性是否有Required属性装饰?

I would suggest not doing that way because you're adding logic in the view which is a bad practice.
Why don't you create a HtmlHelper or LabelExtension, you can call ModelMetaProvider inside the method and find out whether the property has Required attribute decorated?

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