2013-10-29 19 views
1

我有一個基本的MVC編輯頁面,我的一個LINQ到SQL對象稱爲AVC,它與MemberKommuns有一對多的關係,我想顯示用戶的所有MemberKommuns的列表,以便他們可以選擇他們想要的。MVC C#綁定一個LINQ到SQL對象與編輯頁面的一對多關係

的編輯頁面

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" /> 

POST版本的編輯頁面的縮短版get函數。剛打印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的其餘部分?

回答

0

這裏的問題是,您的輸入字段前綴有一些Item1Item2屬性,我非常懷疑您的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控制器操作當然需要th e查看模型作爲參數:

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

現在一切都會綁定好和花花公子。

+0

謝謝你的作品。我不明白你的區別是什麼,當我將AVC和List 放入泛型時,不會像元素MyViewModel一樣? – Imapler

+0

不,它看起來不一樣。查看生成的標記,更具體地查看輸入字段的名稱。此外,您的控制器操作無法將Tuple作爲參數,因爲相應的屬性(Item1和Item2)沒有setter,這意味着默認模型聯編程序永遠無法設置它們。所以遠離這些元組並使用視圖模型。 –

+0

啊我看到了,謝謝你的解釋 – Imapler