Работает ли ReadOnly (true) с Html.EditorForModel? - PullRequest
7 голосов
/ 18 августа 2010

Рассмотрим следующую настройку:

Модель:

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"
            });
    }
}

Результат естьthis: alt text

Я ожидал, что свойство ProductID не будет редактируемым через атрибут ReadOnly(true).Это поддерживается?Если нет, то есть ли способ намекнуть ASP.NET MVC, что некоторые свойства моей модели доступны только для чтения?Я не хотел бы просто прятать ProductID через [ScaffoldColumn(false)].

Ответы [ 3 ]

11 голосов
/ 25 февраля 2011

Я решил эту проблему, добавив атрибут UIHintAttribute к свойству в моем классе « ReadOnly ».

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

Затем я просто добавил файл ~ \ Views \ Shared \ EditorTemplates \ ReadOnly.ascx в свой проект со следующим:

<%= Model %>

Действительно простой способ добавления пользовательских шаблонов, вы можете включить форматирование или что-то еще.

9 голосов
/ 18 августа 2010

Атрибуты 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) %>

Также обратите внимание, что механизм связывания по умолчанию не будет копировать значение в свойство с [ReadOnly(false)].Этот атрибут не влияет на пользовательский интерфейс, отображаемый шаблонами по умолчанию.

2 голосов
/ 08 февраля 2012
<%@ 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) %>
...