针对HiddenInput的Asp.Net MVC ModedMetadata问题

时间:2010-10-13 14:30:39

标签: asp.net asp.net-mvc modelmetadata

我在dll中有一个非常简单的视图模型,我想与主要的web mvc项目分开。

我正在使用元数据属性来装饰模型,这将有助于ui显示正确的表示(DisplayName,UIHint,DataType,ReadOnly等),我想稍后将这些信息重用于不同的表示层(如Silverlight)

大多数属性来自命名空间System.ComponentModel.DataAnnotations 但我很惊讶地发现 HiddenInput 是一个例外,我需要在我的视图模型dll中添加对System.Web.Mvc的引用。

是否有特殊原因不将其与其他属性包含在内?

我试图覆盖在editortemplates文件夹中放置HiddenInput.ascx的默认行为,但是当我在视图中调用html.EditorfForModel()时,我仍然得到该字段的标签。

1 个答案:

答案 0 :(得分:3)

我认为没有被包含在System.ComponentModel.DataAnnotations中的原因是因为这个程序集是BCL的一部分并且在ASP.NET MVC之前存在。 Brad Wilson在MVC中写了一个很好的blog post覆盖模型元数据,你可能会读到它。

据说你可以使用[UIHint]这样的属性:

public class MyViewModel
{
    [UIHint("Hidden")]
    public string Value { get; set; }
}

~/Views/Home/EditorTemplates/Hidden.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<%: Html.HiddenFor(x => x) %>

现在,您可以在视图中使用<%= Html.EditorForModel() %>,它将选择自定义模板。

当然首选使用[HiddenInput],因为它会让您编写更少的代码,但如果您不想在项目中引用System.Web.Mvc,那么您仍然可以使用UIHint解决方法。