3

キーワード: asp.net mvc 3、チェックボックス リスト、厳密に型指定されたビュー。

したがって、ViewBag や formcollection の使用を勧めないでください。

私は Web フォーム開発は初めてではありませんが、asp.net MVC はかなり初めてです。

登録ページに次のようなものがあるとします。

非常にシンプルな登録フォーム

ビューモデルはどのようになりますか? 次のように見えますか?

public class RegistrationViewModel

{

// To store the selected state ID upon postback.
public int StateId {get; set; }  

// A list of states to populate the dropdown.
public Dictionary<int, string> States {get; set; } 

// To store the list of insurance companies the user has used before.
public int[] PriorInsuranceCompanies {get; set; } 

// A list of insurance companies to populate the check box list.
public Dictionary<int, string> InsuranceCompanies {get; set; }

}

スクリーン ショットに示されているようなビューを作成する方法は知っていますが、コントローラーでユーザー入力のビュー モデル値を取得する方法がわかりません。強く型付けされたビューを好むことを思い出してください。mvc フレームワークは、どちらがどちらであるかをどのように判断しますか? 共有する最小限の作業サンプルはありますか (できれば完全な実行可能なプロジェクトで)。ありがとうございました。

4

1 に答える 1

4

あなたが使用しているアプローチは正しいです。常にビューモデルを使用し、ViewBag を使用しないことに同意します。

ビューモデルでは、辞書を MultiSelectList に変更して、選択した値も取得できるようにする必要があります。

public IList<int> PriorInsuranceCompaniesSelected { get; set; }
public MultiSelectList PriorInsuranceCompanies { get; set; }

次に、いくつかの Id が既に選択されている場合は最初のフィールド (たとえば、リポジトリからデータをロードするときに取得する情報) をマップし、2 番目のフィールドにはすべての値をマップします。

Get 部分のコントローラーから (例としていくつかのコード):

  model.PriorInsuranceCompaniesSelected = new List<int>();
  var companies = repository.GetPriorInsuranceCompanies();
  //add to your PriorInsuranceCompaniesSelected the values already checked from your entity
  var entity = repository.GetEntityBy(id);
  if (entity.PriorInsuranceCompanies != null)
    foreach (var item in entity.PriorInsuranceCompanies)
      model.PriorInsuranceCompaniesSelected.Add(item.Id);

  var select = (from s in companies select new { Id = s.Id, Name = s.Name }).OrderBy(x => x.Name); //.ToList;
  model.PriorInsuranceCompanies = new MultiSelectList(select, "Id", "Name", model.PriorInsuranceCompaniesSelected);

次に、Htmlで次のような出力が得られます

@foreach (var item in Model.PriorInsuranceCompanies)
{
   <label for="@item.Value" class="check">
   <input type="checkbox" id="@item.Value" name="PriorInsuranceCompaniesSelected" value="@item.Value" @(item.Selected ? "checked" : "") />@item.Text</label>
}

投稿時に、ModelBinder は正しいオブジェクトをモデルに自動的にマップします。model.PriorInsuranceCompaniesSelected の値を確認するだけです。

[HttpPost]
public ActionResult MyForm(MyViewModel model)
{
  if (ModelState.IsValid)
  {
    try
    {
      //your mapping code or whatever...

      //You do your things with the selected ids..
      if (model.PriorInsuranceCompaniesSelected != null && model.PriorInsuranceCompaniesSelected.Count > 0)
        entity.PriorInsuranceCompanies = repository.GetCompaniesBy(model.PriorInsuranceCompaniesSelected);
      else
        entity.PriorInsuranceCompanies = new List<Comapny>();
      repository.Save(entity);

      return RedirectToAction("Index");
    }
    catch (RulesException ex)
    {
      ex.CopyTo(ModelState);
    }
    catch
    {
      ModelState.AddModelError("", "My generic error taken form a resource");
    }
  }

  //rehydratates the list in case of errors
  //....
  return View(model);
}

これにより、何をすべきかがわかります。役立つことを願っています

于 2012-05-18T03:35:58.143 に答える