0

我有一个基本的创建/编辑/删除/索引格式,由 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>
}
4

3 回答 3

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 显式映射到列表中的某个项目,因此它失败了。

此外,如果您像我一样使用实体框架,您很可能必须使用 ViewModel 来访问数组元素。

于 2013-03-14T16:52:56.350 回答
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)
于 2013-03-14T13:02:24.130 回答
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)
于 2013-03-14T13:09:43.627 回答