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)
添加自定义模板的一种非常简单的方法,您可以包括格式或其他.
在ReadOnly和Required属性将通过元数据提供商被消耗,但不会被使用.如果你想摆脱输入,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.