1

ドメインモデルをビューのパラメータとして直接使用するのは悪い習慣だと私はいつも見ています。しかし、それ以外の方法で行うと、非常に複雑でエラーが発生しやすくなります。例:

これが編集するためのビューItemViewModelです:

@model ItemViewModel 

@using (Html.BeginForm())
{
    <p>@Html.ValidationSummary()</p>

    @Html.LabelFor(o => o.ItemId) : @Html.EditorFor(o => o.ItemId)      
    @Html.LabelFor(o => o.MyItemProperty) : @Html.EditorFor(o => o.MyItemProperty)
}

そして、これを処理するためのコントローラーメソッドは次のとおりです

public ActionResult Edit(int? id) 
{
    Item itemViewModel = new ItemViewModel();

    if (id != null && id != 0)
    {
        var item = itemRepository.Items.FirstOrDefault(c => c.Id == id);
        if (item != null)
        {
            itemViewModel.ItemId = item.ItemId;
            itemViewModel.MyItemProperty = item.ItemId;
        }
    }

    return View(itemViewModel);
}

[HttpPost]
public ActionResult Edit(ItemViewModel itemViewModel)
{
    var item = itemRepository.Items.FirstOrDefault(c => c.Id == itemViewModel.Id);
    item.Id = itemViewModel.Id;
    item.MyItemProperty = itemViewModel.MyItemProperty;
    itemRepository.Save(item);

    return View("Success");
}

それは私が再びに変換ItemしなけれItemViewModelばならないことを意味しItemます。また、に新しいプロパティをItem追加し、それを変換に追加するのを忘れると、変更が保存されなくなります。

これはあなたがそれをする方法ですか、それとも私は何かを逃しましたか?

4

1 に答える 1

1

いくつかのこと。上記で質問したように、ItemからItemModel、Itemに変換します。次に、ItemModelをプロパティとして持ち、ビューの@modelであるSomethingRelevantViewModelという別のクラスを作成します。次に、基本的に、ドロップダウン、グリッドなどのビューまたはSomethingsModelsのリストに多くの異なるSomethingModelsをアタッチできます。

ItemModelの本当の魔法は、DataAnnotationsを追加するときです。これは、LabelForを使用しているため使用しているように見えます。必要なものやより複雑なものにDataAnnotationsを使用することもできます。

多くの場合、データファーストのEntity Frameworkを使用し、SomethingModelの開始点としてT4自動生成クラスをコピーして貼り付けることで不正行為を行います。このプロセスを高速化する方法はたくさんあります。

于 2013-02-28T20:45:19.380 に答える