1

MemberKommuns と 1 対多の関係を持つ AVC と呼ばれる linq to sql オブジェクトの 1 つの基本的な mvc 編集ページがあり、ユーザーが必要なものを選択できるように、すべての MemberKommuns のリストを表示したいと考えています。

編集ページの get 関数

public ActionResult Edit(Guid id)
{
    AVC avc = DatabaseManager.GetAVC(id); //get avc by id

    List<MemberKommun> kommuns = DatabaseManager.GetMemberKommuns(); //get all MemberKommuns

    //turn list into list of listItems for the drop down control
    List<SelectListItem> listItems = new List<SelectListItem>();
    for (int i = 0; i < kommuns.Count; i++)
    {
        listItems.Add(new SelectListItem()
        {
            Selected = kommuns[i].Id == avc.MemberKommunId,
            Text = kommuns[i].Name,
            Value = kommuns[i].Id.ToString(),
        });
    }

    //send data to page as tuple
    Tuple<AVC, List<SelectListItem>> data = new Tuple<AVC, List<SelectListItem>>(avc, listItems);
    return View(data);
}

HTMLページの短縮版

@model Tuple<AVC, List<SelectListItem>>
@Html.HiddenFor(model => model.Item1.Id)
@Html.DropDownListFor(model => model.Item1.MemberKommunId, Model.Item2, new { size = 10 })
@Html.EditorFor(model => model.Item1.Name)
<input type="submit" value="Edit" />

編集ページの投稿バージョン。avc を json として出力するだけのダミー関数

[HttpPost]
public string Edit(AVC viewData)
{
    return Helper.ToJson(viewData);
}

Json データ

{ 
"Id": "3ad40e34-c660-4226-87e0-fd7c2dca0e8d", 
"MemberKommunId": "00000000-0000-0000-0000-000000000000", 
"Name": null, 
}

json データが示すように、id は正しくバインドされますが、残りのフィールドはデフォルト値になります。完全なコードでは、AVC にはさらにいくつかのフィールドがあり、それらはすべてデフォルト値を取得します。明確にするためにそれらを削除しました。

ポスト関数で MemberKommuns のリストを取得する必要はありません。後処理で AVC の残りの部分をバインダーに入力させるにはどうすればよいですか?

4

1 に答える 1

0

ここでの問題は、入力フィールドにいくつかのプレフィックスが付けられていることItem1と、モデルItem2に存在することを非常に疑うプロパティです。AVC入力フィールド名に接頭辞が付いているのは、Tuple クラスをビュー モデルとして使用したためです。

したがって、これを機能させるには、このタプルのものを取り除き、実際のビュー モデルを記述します。

public class MyViewModel
{
    public AVC AVC { get; set; }
    public List<SelectListItem> Items { get; set; }
}

コントローラーアクションが入力されること:

public ActionResult Edit(Guid id)
{
    AVC avc = DatabaseManager.GetAVC(id); //get avc by id

    List<MemberKommun> kommuns = DatabaseManager.GetMemberKommuns(); //get all MemberKommuns

    //turn list into list of listItems for the drop down control
    List<SelectListItem> listItems = new List<SelectListItem>();
    for (int i = 0; i < kommuns.Count; i++)
    {
        listItems.Add(new SelectListItem()
        {
            Selected = kommuns[i].Id == avc.MemberKommunId,
            Text = kommuns[i].Name,
            Value = kommuns[i].Id.ToString(),
        });
    }

    var model = new MyViewModel();
    model.AVC = avc;
    model.Items = listItems;
    return View(model);
}

これで、ビューをビュー モデルに強く型付けできます。

@model MyViewModel
@Html.HiddenFor(model => model.AVC.Id)
@Html.DropDownListFor(model => model.AVC.MemberKommunId, Model.Items, new { size = 10 })
@Html.EditorFor(model => model.AVC.Name)
<input type="submit" value="Edit" />

もちろん、POSTコントローラーアクションはビューモデルをパラメーターとして受け取ります。

[HttpPost]
public string Edit(MyViewModel model)
{
    return Helper.ToJson(model.AVC);
}

そして今、すべてが素敵でダンディになります。

于 2013-10-29T11:55:44.990 に答える