ReadOnly(true)是否与Html.EditorForModel一起使用?

Ata*_*hev 7 asp.net-mvc readonly-attribute asp.net-mvc-2

请考虑以下设置:

模型:

public class Product
{
    [ReadOnly(true)]
    public int ProductID
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<MvcApplication4.Models.Product>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <%= Html.EditorForModel() %>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new Product
            {
                ProductID = 1,
                Name = "Banana"
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

结果如下: 替代文字

我期待该ProductID属性不会通过该ReadOnly(true)属性进行编辑.这支持吗?如果没有,有没有办法提示ASP.NET MVC我的模型的某些属性是只读的?我不想隐藏ProductID通过[ScaffoldColumn(false)].

pwh*_*e23 11

我通过在我的" ReadOnly " 类的属性中添加UIHintAttribute来解决这个问题.

[UIHint("ReadOnly")]
public int ClassID { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后我简单地在其中添加了一个〜\ Views\Shared\EditorTemplates\ReadOnly.ascx文件到我的项目中:

<%= Model %>
Run Code Online (Sandbox Code Playgroud)

添加自定义模板的一种非常简单的方法,您可以包括格式或其他.

  • 一个更酷的方法可能是像[Brad Wilson的帖子]那样继承**DataAnnotationsModelMetadataProvider**类(http://bradwilson.typepad.com/blog/2010/01/why-you-dont-need-modelmetadataattributes.html )并简单地添加以下行:`if(metadata.IsReadOnly)metadata.TemplateHint ="ReadOnly";`与我的帖子中的ReadOnly.ascx文件结合使用,这应该使ReadOnly(true)属性像您期望的那样工作.ASP.NET MVC摇滚! (6认同)

Dar*_*rov 9

ReadOnlyRequired属性将通过元数据提供商被消耗,但不会被使用.如果你想摆脱输入,EditorForModel你需要一个自定义模板,或[ScaffoldColumn(false)].

对于自定义模板~/Views/Home/EditorTemplates/Product.ascx:

<%@ Control Language="C#" Inherits="ViewUserControl<Product>" %>

<%: Html.LabelFor(x => x.ProductID) %>
<%: Html.TextBoxFor(x => x.ProductID, new { @readonly = "readonly" }) %>

<%: Html.LabelFor(x => x.Name) %>
<%: Html.TextBoxFor(x => x.Name) %>
Run Code Online (Sandbox Code Playgroud)

另请注意,默认模型绑定程序不会将值复制到属性中[ReadOnly(false)].此属性不会影响默认模板呈现的UI.