2013-03-14 77 views
0

我有一個基本的創建/編輯/刪除/索引格式由MVC與我的班(ClassA)創建。該類包含對象列表(ClassB)。MVC修改對象列表

當我調用視圖來編輯對象時,我可以編輯ClassA的所有成員(textfields等),但是如何編輯對象列表然後仍然讓它們返回到發佈操作?

當我嘗試創建並遍歷對象並將它們添加到窗體時,它不會與對象(ClassA)一起返回並且對象列表爲空。

請幫忙。這樣做的最佳做法是什麼?

下面是一個例子

public ActionResult Edit(int id) 
    { 
     ClassA objA = db.ClassAs.Single(a => a.id == id); 

     objA.myListOfBs.Add(new ClassB()); 

     return View(objA); 
    } 

    [HttpPost] 
    public ActionResult Create(ObjectA obj) 
    { 
     obj.myListOfBs <--- this is empty! :(
     if (ModelState.IsValid) 
     { 
     } 

     return View(obj); 
     } 

模型類:

class ClassA { 
     int id; 
    List<ClassB> myListOfBs; 
} 

class ClassB { 
    int id; 
    string name; 
} 

這是我的看法

@model MyProject.Models.ClassA 

@{ 
    ViewBag.Title = "ClassA Object"; 
} 
@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Objects</legend> 

     @Html.EditorFor(model => model.myListOfBs) 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 
+0

請問你可以發佈你的模型類嗎? – Oliver 2013-03-14 12:59:22

+0

http://stackoverflow.com/questions/15049463/mvc4-adding-deleting-from-nested-collections-with-jquery/15049977#15049977 – 2013-03-14 13:00:28

+0

你的問題幾乎肯定在你看來。你可以發佈嗎?我猜你正在使用'foreach'循環遍歷列表,並且不尊重mvc模型綁定器的命名要求' – 2013-03-14 13:10:27

回答

1

爲什麼會發生這種情況。這是我的一個錯誤,但是我沒有意識到會導致它。

我的主要對象中的對象被宣佈

class ClassA { 
public ClassB country; 
} 

,而不是

class ClassA { 
public ClassB country {get; set;} 
} 

所以看起來它必須是正確綁定對象的屬性。

主要解決的問題這裏

我也想補充的是,雖然添加了設置/獲取標籤允許對象的穿過到了後,它仍然無法與列表中的對象裏面工作。

我終於找到了如何做到這一點在這裏(ASP.NET MVC 3 Binding to a Collection inside an Object),其中基本上你需要映射到特定項目示範

例子:

@for (int i = 0; i < Model.myListOfBs.Count; i++) 
{ 
    <div> 
     @Html.LabelFor(m => Model.myListOfBs[i].name) 
    </div> 
    <div> 
     @Html.TextBoxFor(m => Model.myListOfBs[i].name) 
    </div> 
} 

映射明確到陣列的位置做了訣竅。由於您不能使用foreach顯式映射到列表項,因此失敗。

此外,如果你是像我一樣使用實體框架,你很可能將不得不使用ViewModels來訪問數組元素。

0

我以前見過這個。最簡單的方法來做到這一點(這個例子結構):

視圖模型:

public string CompanyName { get; set; } 
public List<ViewModelOfObjects> SubObjects { get; set; } 

就像你所看到的,你的子對象,應該有自己的視圖模型,那麼您可以在您的視圖做到這一點。

@model YourMainViewModel 

@Html.EditorFor(model => model.CompanyName) 

// MVC is clever enough to work this out and list all the sub-Views, even if they are hidden fields and not editable. 
@Html.EditorFor(model => model.SubObjects) 
+0

我不完全明白這一點,SubObjects被替換爲一個不同的類型嗎?我必須創建一個不同的模型,並將數據從ClassB對象複製到ViewModelOfClassB對象? – 2013-03-14 14:25:04

+0

SubObjects本身是一個ViewModel。是一個Customer對象,它將是一個新的CustomerViewModel,它具有與Customer對象相同的屬性(但是作爲ViewModel),然後MVC將能夠將這些子對象與您的主對象聯繫起來 – 2013-03-14 14:28:42

+0

恐怕這仍然存在雖然我嘗試創建一個字符串列表,並使用@ Html.EditFor在視圖上查看它,並且它工作正常!它通過了它正確粗略,並且回傳中列表不爲空。我認爲ViewModel與Model相同,但是結構發生了變化,而您不想修改基本模型? – 2013-03-14 15:10:26

0

我過去的做法是使用模型聯編程序可以識別的命名約定來綁定集合。

例如,在你的情況,你可以在你的看法如下:

@model ClassA 
int index = 0; 
@foreach (var classB in Model.myListOfBs) 
{ 
    //Notice the use of "obj", this matches the name of your model parameter in your post action 
    @Html.Hidden("obj.myListOfBs.Index", index) 
    @Html.TextBox("obj.myListOfBs[" + index + "].name", classB.name) 
    index++; 
} 

當發佈此表到你的動作,該模型粘合劑將使用上面詳述的索引命名約定綁定每個字段到模型中的myListOfBs集合。

此外,作爲@thedixon指出,MVC框架可以自動創建的字段名(我不知道這是可能的ASP.NET的所有版本MVC):發現

@Html.EditorFor(model => model.myListOfBs)