5

ビューに表示されているアイテムのリストがあります。追加ボタンを使用して、UIからこのリストにアイテムを手動で追加できるようにする必要があります。新しいアイテムを表示するには、javascriptを使用して部分ビューをロードする必要があることを知っています。

@{var count = 0;}
@foreach (var dx in Model.Patient.DxList)
{    
    <div class="form-field">
        <label>@(++count)</label>
        @Html.HiddenFor(d => dx.DxIndex)
        @Html.TextBoxFor(d => dx.Dx, new { @class = "small" })
        <span class="description">@((dx.DxRef != null) ? dx.DxRef.Title : "")</span>
        @Html.DropDownListFor(d=> dx.Indicator, new SelectList(Model.Codes, "Value", "Description", dx.Indicator), "Please select", new { @class = "" })
    </div>
}

ただし、アイテムにはTextBoxとコードが入力されたDropDownListの両方が含まれているため、部分ビューにもViewModelが必要ですか?Dxだけでなく、リストを作成するための適切なコードのリストを含めるには?

public class DxSingleViewModel
{
    public Dx Dx { get; set; }
    public List<Code> Codes { get; set; }
}

これが一般的なアプローチなのか、それとも私がベースから外れているのかはわかりません。

4

2 に答える 2

2

1つのアイテムのレンダリングを別の部分ビュー/エディターテンプレートに分離し、それをforeachループ内で呼び出す必要があります。これにより、1つのアイテムのマークアップを定義する場所が1つになります。

@foreach (var dx in Model.Patient.DxList)
{
    @Html.EditorFor(m => dx)
}

次に、AddNewItemアクションは、呼び出すだけの部分ビューを返すことができます@Html.EditorForModel()

行を動的に追加および削除する場合は、衝突を回避するために、アイテムに独自のインデックス(たとえば、GUID文字列)を埋め込む必要があります。カスタムhtmlヘルパーを使用してこれを実装する方法を説明するこの素晴らしい記事を見てください:http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2 -スタイル/

EditorTemplateは次のようになります。

@using (Html.BeginCollectionItem("DxList"))
{
    @Html.TextBoxFor(d => dx.Dx, new { @class = "small" })
    ....
}

ビューモデルにドロップダウンのリストが含まれるべきかどうかについての質問について:ビューモデルには、ビューをレンダリングするために必要なすべてのデータが含まれている必要があります。だから私はそう言うでしょう、それはリストをビューに渡すのに良い場所です。

当然のことながら、ビューバッグに渡すこともできますが、私は強い型のデータバッグの友達なので、ビューモデルを好みます。

于 2012-11-19T15:08:34.983 に答える
0

このアプローチを試すことができます。自動バインドのために正しい入力名をレンダリングするには、プロパティの名前(パス)を覚えておく必要があるという欠点があります(したがって、リファクタリングツールで簡単に変更することはできません)。

意見

@foreach (int i=0;i < Model.Patient.DxList.Count;i++)
{
    @{Html.RenderPartial("PartialDx", Model.Patient.DxList[i] ,new ViewDataDictionary() { {"count",i}});}
}

PartialView-タイプが次の強い型の部分ビューDxSingleViewModel

@{string collectionName = string.Format("Patient.DxList[{0}].", ViewBag.count);}

<div class="form-field">
   <label>@{ViewBag.count + 1}</label>
   @Html.Hidden(collectionName+"Dx.DxIndex", Model.Dx.DxIndex)

</div>
于 2012-11-19T22:53:19.887 に答える