1

私は次のようなビューモデルを持っています:

public class AttributeEditorViewModel
{
    public long AttributeId { get; set; }
    public string DisplayName { get; set; }
    public object Value { get; set; }
}

モデルはモデル ビルダーを使用して構築されるため、最終的なビュー モデルには上記のオブジェクトのリストが含まれます。

public class AttributeListViewModel
{
    public List<AttributeEditorViewModel> Attributes { get; set; }
}

私のモデル ビルダーは、AttributeEditorViewModel オブジェクトのリストをコンパイルし、適切なプリミティブ型を Value プロパティに設定します。データ型は、属性の個別の定義から取得されます。

これで、Razor ビュー (edit.cshtml としましょう) は次のようになります。

@model AttributeListViewModel

@Html.EditorFor(m => m.Attributes)

およびエディター テンプレート Views/Shared/EditorTemplates/AttributeEditorViewModel.cshtml:

@model AttributeEditorViewModel

<div>
    <label>@Model.DisplayName</label>
    @Html.EditorFor(m => m.Value)
    @Html.ValidationMessageFor(m => m.Value)
</div>

私が期待すること。AttributeEditorViewModel の Value プロパティを double に設定すると、次のようになります。

public ActionResult Edit()
{
    return View(new AttributeListViewModel 
    {
        Attributes = new List<AttributeEditorViewModel> 
        {
            new AttributeEditorViewModel { DisplayName = "Double example", Value = (double) 0 }
        }
    };
}

テキストボックスがレンダリングされると思います。代わりに、何もレンダリングしません。別のエディター テンプレート Views/Shared/EditorTemplates/Double.cshtml を追加しました。

@model double

@Html.TextBoxFor(m => m)

これにより、差し迫った問題が解決されました。だから今、値0のテキストボックスを取得します。ただし、カスタム エディター テンプレート内であっても EditorFor を使用すると、何もレンダリングされません。

オブジェクトを基本型として使用するのは根本的に間違っていますか? EditorFor または EditorForModel を使用すると何もレンダリングされないのはなぜですか?

任意の洞察をいただければ幸いです。

4

3 に答える 3

1

のオブジェクトとエディターの問題は、まさにそれが何をしたいのかということです。それぞれが300列と20,000行を含む2,000,000個のDataTableのディクショナリが含まれていると想像してください。正確に何を表示する必要がありますか?モデルでオブジェクト型のプロパティを使用することに本質的に問題はありません。オブジェクトに貼り付けたものに基づいて、Razorが表示するエディターの種類を魔法のように知っているとは思わないでください。

于 2012-12-10T17:42:31.523 に答える
1

これは、EditorFor がジェネリック パラメーターでコンパイル時のバインディングを使用して、レンダリングするテンプレートを決定するためです。

EditorFor<object>()デフォルトでは何も定義されていないため、何も得られません。

必要に応じて、オブジェクト用に独自のエディター テンプレートを定義できると思いますが、ビュー モデルをジェネリックにすることをお勧めします。

public class AttributeEditorViewModel<TValue>
{
    public long AttributeId { get; set; }
    public string DisplayName { get; set; }
    public TValue Value { get; set; }
}

ただし、ポリモーフィック ビュー モデルのリストを使用できなくなるため、これは理想的ではない可能性があります。

于 2012-12-10T17:39:48.133 に答える
1

実際の問題は、Razor ビュー コードにあります。あなたがするとき:

@Html.EditorFor(m => m.Attributes)

EditForのテンプレートを探すようにビュー エンジンに指示していList<AttributeEditorViewModel> ます AttributeEditorViewModel。したがって、デフォルトを使用しますObjectTemplate

[edit.chtml]次のようなものを試してください:

@model AttributeListViewModel

@foreach (var att in Model.Attributes)
{
  @Html.EditorFor(m => att)
}

この正確な答えがうまくいくとは思いませんが(私はVS atmを搭載したマシンではありません)、問題を理解することができます.

于 2012-12-10T18:00:41.033 に答える