【问题标题】:How to display a model decoration in the view?如何在视图中显示模型装饰?
【发布时间】:2012-02-28 10:43:26
【问题描述】:

我用搜索字符串构建了一个搜索模型,并用 minlength 装饰了它。在我的视图中,我想显示搜索字符串的要求,但我怎样才能得到装饰?

型号:

public class SearchModel
{
    [StringLength(50,MinimumLength = 4)]
    public string Searchname { get; set; }
}

剃须刀:

@model Project.Models.SearchModel

<p>
    The search value has to be a min length of: ... 
</p>

【问题讨论】:

  • 常量?但我同意获取属性值的函数会更好。我认为使用反射是可能的。

标签: asp.net-mvc asp.net-mvc-3 razor decorator


【解决方案1】:

你可以这样做:

@(typeof(SearchModel).GetProperty("Searchname").GetCustomAttributes(true)
    .OfType<StringLengthAttribute>().First().MinimumLength)

虽然为了 MVC 的纯洁性,您应该避免将此逻辑放入视图代码中。要么:

  • 让您的 Controller 获取此信息并将其作为单独的属性放入 Model 本身,或者
  • 使用自定义 ModelMetadataProvider 通过模型元数据提供信息。

【讨论】:

  • 我喜欢你的简单解决方案 :-),但是有一个问题 “方法 'GetCustomAttributes' 没有重载需要 0 个参数”(也许还需要添加命名空间?)
  • 这很好用:typeof(NAMESPACE.SearchModel).GetProperty("Searchname").GetCustomAttributes(true).OfType&lt;System.ComponentModel.DataAnnotations.StringLengthAttribute&gt;().First().MinimumLength
【解决方案2】:

您可以从客户端的验证器属性中获取此值。

$('#Searchname').attr('data-val-length-min')

或者你需要在 razor 的服务器端使用这个?

@{
    var attr = typeof(NAMESPACE.SearchModel).GetProperty("Searchname").GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.StringLengthAttribute), true)[0];
    var min = attr.GetType().GetProperty("MinimumLength").GetValue(attr, null);
}
.
.
.
<p>The search value has to be a min length of: @min</p>

【讨论】:

  • 我也想过这个,如果没有更好的方法我会这样做:-)
  • 也添加了 razor/C# 解决方案。享受吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多