1

我希望 DRY/重用尽可能多的编辑器代码(视图和模型)。我的一些字段只能在创建时设置,不能编辑。我应该查看任何预先存在的 MVC/DataAnnotation 功能吗?

例如,如果值为非空,则可能存在使 EditorFor 像 DisplayFor 一样操作的数据属性。

模型.cs

[Unchangeable]
string UserReferenceId { get; set; }

string Description { get; set; }

编辑:为了阐明我的目标,我为我目前计划的方法添加了一个带有示例代码的答案。如果有更好的方法/预先存在的功能,请告诉我。

4

2 回答 2

1

两者都有System.ComponentModel.ReadOnlyAttributeSystem.ComponentModel.DataAnnotations.EditableAttribute我认为EditableAttribute是.NET 4)。当为标有其中任何一个的属性创建模型元数据时,您可以看到ModelMetadata.IsReadOnly将正确设置。

然而,令人沮丧的是,内置的编辑器模板仍然会显示可编辑的字段,即使ModelMetadata.IsReadOnlytrue.

但是,您可以为希望尊重此元数据属性的每种数据类型创建自己的共享编辑器模板,并专门处理它。

~/Views/Shared/EditorTemplates/String.cshtml

@model String
@if (ViewData.ModelMetadata.IsReadOnly)
{
  @Html.Hidden(string.Empty, Model)
}
@(ViewData.ModelMetadata.IsReadOnly ? Html.DisplayText(string.Empty) : Html.TextBox(string.Empty))

查看模型

[Editable(false)]
public string UserReferenceId { get; set; }

您会注意到,如果模型的元数据指示 IsReadOnly,我会绘制一个隐藏字段。这样该属性的值就会在帖子中保持不变。

如果您根本不希望该字段显示,而是在帖子中保留,您可以使用System.Web.Mvc.HiddenInputAttribute. 在这种情况下,只绘制隐藏的。

[HiddenInput(DisplayValue=false)]
public string UserReferenceId { get; set; }
于 2012-06-08T04:10:21.327 回答
0

如果没有类似的东西预先存在,这就是我正在考虑实施的:

EditableWhenNewModel.cs

public class EditableWhenNewModel : IIsNew
{
    public bool IsNew { get { return recordId == 0; } }
    string UserReferenceId { get; set; }
    string Description { get; set; }
    public void Save(RepositoryItem record) {
        if (IsNew) { record.UserReferenceId = UserReferenceId; }
        record.Description = Description;
... etc.

查看.cshtml

@model EditableWhenNewModel
@Html.EditorWhenNewFor(m => m.UserReferenceId)
@Html.EditorFor(m => m.Description)

EditorWhenNewFor.cs

public static MvcHtmlString EditorWhenNewFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression
) where TModel : IIsNew {
    return htmlHelper.ViewData.Model.IsNew ?
        htmlHelper.EditorFor(expression) :
        htmlHelper.DisplayFor(expression);
}
于 2012-06-08T09:55:50.917 回答