在对象内修改MVC列表

本文关键字:MVC 列表 修改 对象 | 更新日期: 2023-09-27 18:04:05

我有一个基本的创建/编辑/删除/索引格式创建的MVC与我的类(ClassA)。类包含一个对象列表(ClassB)。

当我调用视图来编辑对象时,我可以编辑ClassA(文本字段等)的所有成员,但是我如何编辑对象列表,然后仍然让它们返回到post action?

当我尝试创建和迭代对象并将它们添加到表单时,它不会与对象(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>
}

在对象内修改MVC列表

找出发生这种情况的原因。这是我的一个错误,但我没有意识到是一个错误造成的。

main对象中的对象被声明为

class ClassA {
 public ClassB country;
}

代替

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

因此,它似乎必须是一个属性来正确绑定对象。

主要问题已解决

我还想补充一点,虽然添加set/get标签允许将对象传递给post,但它仍然不能与对象内部的列表一起工作。

我终于发现如何做到这一点在这里(ASP。. NET MVC 3绑定到对象内的集合),基本上你需要映射到模型中的特定项

的例子:

 @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来访问数组元素。

我以前见过这种情况。最简单的方法(使用这个示例结构)是:

ViewModel:

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

就像你看到的,你的子对象应该有他们自己的ViewModel,然后你可以在你的视图中这样做。

@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)

过去我使用的方法是使用模型绑定器可以识别的命名约定来绑定集合。

例如,在您的例子中,您可以在视图中添加以下内容:

@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中都是可能的。净MVC ):

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