1

できるだけ多くのエディター コード (ビューとモデル) を DRY/再利用したい。一部のフィールドは作成時にのみ設定でき、編集することはできません。確認すべき既存の MVC/DataAnnotation 機能はありますか?

たとえば、値が null でない場合、EditorFor が DisplayFor のように動作するデータ属性があるとします。

Model.cs

[Unchangeable]
string UserReferenceId { get; set; }

string Description { get; set; }

編集:私の目標を明確にするために、現在計画しているアプローチのサンプル コードを含む回答を追加しました。これに対するより良い方法/既存の機能がある場合は、お知らせください。

4

2 に答える 2

1

との両方がありSystem.ComponentModel.ReadOnlyAttributeます( .NET 4System.ComponentModel.DataAnnotations.EditableAttributeだと思います)。これらのいずれかでマークされたプロパティのモデル メタデータが作成されると、正しく設定されるEditableAttributeことがわかります。ModelMetadata.IsReadOnly

ただし、イライラすることに、ビルトイン エディター テンプレートには、ModelMetadata.IsReadOnlyisであっても編集可能なフィールドが表示されtrueます。

ただし、このメタデータ プロパティを尊重したいデータ型ごとに独自の共有エディター テンプレートを作成し、それを具体的に処理することができます。

~/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.

View.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 に答える