0

入力にテキストボックスを使用するビューがあります。テキストボックスを交換してドロップダウンリストを使用する必要があります。コード生成して調整を再適用する代わりに、これを手作りしたいと思います。

データベースを変更しました。フィールドを varchar(50) ではなく、FK の int に変更しました。

EF データ モデルを更新し、FK が正しくマップされていることを確認しました。

ビューのマークアップを変更しました。このドロップダウン リストのコードは、このアプリの別の場所からコピーしました。

    <div class="LabelAndField">
        <div class="editor-label-score">
            @Html.LabelFor(model => model.FootLateralDominanceLateralityId)
        </div>
        <div class="editor-field-score">
            @Html.DropDownList("LateralDominanceLaterality", String.Empty)
            @Html.ValidationMessageFor(model => model.FootLateralDominanceLateralityId)
        </div>
    </div>

ビューモデルに次のコードを追加しました。

public virtual LateralDominanceLaterality LateralDominanceLaterality { get; set; }
public virtual LateralDominanceLaterality LateralDominanceLaterality1 { get; set; }
public virtual LateralDominanceLaterality LateralDominanceLaterality2 { get; set; }

アプリケーションを実行してこのビューに移動すると、次の例外が発生します。

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'LateralDominanceLaterality'.

これを修正するにはどうすればよいですか?

4

2 に答える 2

1

DropDownList に渡していないデータソースがありません。の DropDownList は、クラスの実装と、このコントロールにバインドする値とテキストのプロパティ名をSelectList渡すことができるクラスで動作します。IEnumerable次のようなことを試してください:

1)コントローラーで、プロパティの名前でViewBagにキーを設定します

var list = /* build an List you want to show, for sample: List<LateralDominanceLaterality> */;

// create a SelectList to fill the combo with the sintax of the .ctor (list, value property, text property), e.g.:
var items = new SelectList(list, "Id", "Description");

// set on the ViewBag
ViewBag.LateralDominanceLaterality = items;

2)ビューでは、次のようなことができます:

@Html.DropDownListFor(model => model.LateralDominanceLaterality, ViewBag.LateralDominanceLaterality)
于 2013-03-06T19:08:59.950 に答える
1

現在は 3 ですが、今後増える可能性があります。そのため、ビュー モデルに 3 つのプロパティを追加して 3 つの項目をハード コードしないでください。あなたがすべきことは、ビューモデルにコレクションを保持して、必要に応じて n 個のアイテムを含めることです。また、ViewBag や ViewData などの動的なものは避けてください。強く型付けされたアプローチを使用します。それでは、このようにビューモデルを変更しましょう

public class CustomerViewModel
{
  //Your other existing properties of the viewmodel  goes here

  public List<SelectListItem> Lateralities { set;get;}
  public int SelectedLaterality { set;get;}

  public CustomerViewModel()
  {
    Lateralities =new List<SelectListItem>();
  }
}

GET アクション メソッドで、Lateralitiesコレクションの項目を設定し、viewmodel オブジェクトをビューに送信します。

public ActionResult Add()
{
   var vm=new CustomerViewModel();

 //The below is hard code for adding 3 items to the collection. 
 //You may replace it with data from your table/data access layer

   vm.Lateralities.Add(new SelectListItem { Value="1", Text="Item 1"});
   vm.Lateralities.Add(new SelectListItem { Value="2", Text="Item 2"});
   vm.Lateralities.Add(new SelectListItem { Value="3", Text="Item 3"});

   return View(vm);
}

に強く型付けされたビューでは、ヘルパー メソッドCustomerViewmodelを使用します。Html.DropDownListFor

@model CustomerViewModel
@using(Html.Beginform())
{
  @Html.DropdownListFor(x=>x.SelectedLaterality,
                   new SelectList(Model.Lateralities,"Value","Text"),"select")
  <input type="submit" />    
}

フォームが投稿されると、選択された項目 ID がSelectedLateralityCustomerViewModel のプロパティになります。

[HttpPost]
public ActionResult Add(CustomerViewModel model)
{
  // check model.SelectedLaterality
  //to do : Save and redirect.
}
于 2013-03-06T19:31:21.283 に答える