7

考虑以下设置:

模型:

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

    public string Name
    {
        get;
        set;
    }
}

看法:

<%@ 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>

控制器:

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

结果是这样的: 替代文字

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

4

3 回答 3

11

我通过向我的“ ReadOnly ”类的属性添加 UIHintAttribute 解决了这个问题。

[UIHint("ReadOnly")]
public int ClassID { get; set; }

然后我只是在我的项目中添加了一个~\Views\Shared\EditorTemplates\ReadOnly.ascx文件,其中包含以下内容:

<%= Model %>

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

于 2011-02-25T02:52:58.443 回答
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) %>

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

于 2010-08-18T10:45:51.643 回答
2
<%@ Control Language="C#" Inherits="ViewUserControl<Product>" %>

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

<%: Html.LabelFor(x => x.Name) %>
<%: Html.TextBoxFor(x => x.Name) %>
于 2012-02-08T01:47:14.627 回答