我有一个MVC用我的班级(ClassA)创建的基本创建/编辑/删除/索引格式。该类包含一个对象列表(ClassB)。
当我调用视图来编辑对象时,我可以编辑ClassA的所有成员(文本字段等),但是如何编辑对象列表然后让它们返回到post动作?
当我尝试创建并遍历对象并将它们添加到表单时,它不会与对象(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 :(得分:1)
了解发生这种情况的原因。这是我的一个错误,但我没有意识到会导致它。
我的主对象中的对象被声明为
class ClassA {
public ClassB country;
}
而不是
class ClassA {
public ClassB country {get; set;}
}
所以它似乎必须是一个正确绑定对象的属性。
主要问题已解决
我还想补充一点,虽然添加set / get标签允许将对象传递到帖子,但它仍然不能用于对象内的列表。
我终于在这里找到了如何做到这一点(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显式映射到列表项,因此失败。
此外,如果您像我一样使用Entity Framework,您很可能必须使用ViewModels来访问数组元素。
答案 1 :(得分:0)
我之前见过这个。最简单的方法(使用此示例结构)是:
视图模型:
public string CompanyName { get; set; }
public List<ViewModelOfObjects> SubObjects { get; set; }
您可以看到,您的子对象应该有自己的ViewModel,然后您可以在View中执行此操作。
@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)
答案 2 :(得分: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)