2

他の複雑なクラスのオブジェクトを保持するクラスを作成しました。

たとえば

class A {

    public int ID { set; get; }

    public string MyObjectName {set; get; }

    public B ObjectOfTypeB { set; get; }

}

class B {

    public int ID { set; get; }

    public int CategoryNumber { set; get; }

    public string CategoryDescription { set; get; }

}

これで、タイプ A のオブジェクトを作成するコントローラー メソッドができました。モデル (クラス A) を作成するためのビューを足場にしました。しかし、A は複合型を保持しているため、B 型の入力フィールドを作成する方法がわかりません。

私の作成機能では

// helper method to get a list of the possible B objects - 
// this method will eventually query a database. for now just static objects

private List<Category> getBobjects()
{
    List<B> bs = new List<B>();
    bs.Add(new B() { ID = 1, CategoryNumber = 2, CategoryDescription = "Config 1" });
    bs.Add(new B() { ID = 2, CategoryNumber = 3, CategoryDescription = "Config 2" });
    return bs;
}

[HttpGet]
public ActionResult Create()
{
    // Adding to the view bags the categories to display
    ViewBag.bs = getBobjects();
    return View();
}

そしてビューで

@Html.DropDownListFor(model => model.ObjectOfTypeB, 
       new SelectList(ViewBag.bs, "ID", "CategoryDescription"))

フォームを送信すると、ObjectOfTypeB のデータがタイプ A のポスト バック オブジェクトにバインドされると想定しましたが、そうではありません。

特定のフィールドの可能な値のリストをビューに渡し、ポストバックで値を返されたオブジェクトにバインドする方法を誰か説明できますか?

[バグ印刷画面][1]

4

4 に答える 4

1

バインディングが正しくありません。IDあなたがあなたの財産の財産を埋めようとしているならObjectOfTypeB、あなたDropDownListForはにバインドする必要がありますmodel => model.ObjectOfTypeB.ID

ソースを表示する<select name="ObjectOfTypeB.ID">場合、ポストバックでそのプロパティを自動入力することを期待する場合、ソースは次のようになります。

この場合、おそらくViewModel(VM)を使用してモデルを再設定します。Bには選択したIDに関連するカテゴリと説明が含まれているため、オブジェクトB全体を実際に入力しているわけではありません。つまり、3つのプロパティは結合されており、個別に入力することはできません。

私は次のようなことをします:

class AViewModel
{
    public int ID {set;get;}

    public string MyObjectName {set; get;}

    public int IDofB { set; get; }
}

AとAViewModelの間の変換を簡単にするために、AutoMapperなどのツールを調べてください。

于 2013-01-02T16:12:32.443 に答える
0

ViewBagバインドを に戻すには、再度入力する必要がありますView。この ViewBag を埋めるメソッドを作成し、それを get/post メソッドの add/edit でも使用できます。ViewModelsあなたの(私は as を呼び出すのが好きですInputModel) をプリミティブ型 ( string, int, double, ) のみに保つようにしてください。boolつまり、B 複合型を a に変更しintます。次のようなことを試してください:

private void SetViewBagCombo(int selectedValue = 0)
{
   ViewBag.bs = new SelectList(getBobjects(), "Id", "CategoryDescription", selectedValue);
}

public ActionResult Create()
{
   SetViewBagCombo(); 
   return View();   
}

[HttpPost]
public ActionResult Create(A input)
{
   if (ModelState.IsValid)
   {
      // persist it
      return RedirectToAction("Index");
   }

   SetViewBagCombo(input.B.Id); 
   return View();   
}

そしてあなたのビューで:

@Html.DropDownListFor(model => model.IdOfB, (SelectList)ViewBag.bs, "Select...")
于 2013-01-02T16:18:53.477 に答える
0
  private IList getBobjects()
        {
        List<B> bs = new List<B>();
        bs.Add(new B() { ID = 1, CategoryNumber = 2, 
             CategoryDescription = "Config 1" });
        bs.Add(new B() { ID = 2, CategoryNumber = 3, 
             CategoryDescription = "Config 2" });
        return bs;
        }

    public IList<SelectListItem> GetDropdownlistItems()
    {
        IList<SelectListItem> ilSelectList = new List<SelectListItem>();

        IList objlist = getBobjects();
        foreach (object[] arrobject in objlist)
        {
            SelectListItem selectListItem = new SelectListItem();
            selectListItem.Value = arrobject[0].ToString();
            selectListItem.Text = arrobject[1].ToString();
            ilSelectList.Add(selectListItem);
        }

        return ilSelectList;
    }

    public ActionResult Create()
    {
        IList<SelectListItem> ilSelectListItems = GetDropdownlistItems();
        ViewBag.bs = ilSelectListItems;
        return View();
    } 

そしてビューで:

@Html.DropDownList("bs", new SelectList(ViewBag.bs, "Text", "Value"))

これが役立つことを願っています、ありがとう。

于 2013-01-02T17:12:28.077 に答える
0

その複雑なクラス型モデルのビューモデルを作成しました

ネストされたオブジェクトごとにキーがあり、それらのキーには、参照されるオブジェクト タイプの選択リストを使用してテキストを表示します。

その後、ポストバックでビューモデルをモデルのタイプに戻しました

于 2013-01-16T10:46:22.713 に答える