0

我有两个模型:OuterModel 和 InnerModel。OuterModel 和 InnerModel 之间分别存在一对多的关系。为了澄清我的问题,我的模型属于 IEnumerable<OuterModel> 类型。我将随机数量的 OuterModel 传递给视图,用户为每个 OuterModel 创建任意数量的 InnerModel。然后在提交时,我希望控制器接收 OuterModels 列表,以便 InnerModels 可以添加到数据库中以添加到它们预期的 OuterModels。

我相信我的命名约定是正确的,可以使用 MVC 的内置模型绑定。看起来是这样的:

OuterModel[i].InnerModel[j].Property

我的问题是,我真的不知道如何获取传递给控制器​​的 OuterModel 列表。这是我在视图中尝试过的:

    @model IEnumerable<OuterModel>

    @using (Html.BeginForm("Create", "Controller", new { OuterModels = Model }, FormMethod.Post))
    {
       //Code to create the InnerModels here
    }

这是我的控制器中的内容:

    [HttpPost]
    public ActionResult Create(IEnumerable<OuterModel> OuterModels, FormCollection fc)
    {
       String[] keys = fc.AllKeys;
       if(ModelState.IsValid){
          //Add to db
       }
    }

Keys 显示我的所有属性都遵循我之前指定的命名约定,但 ModelState.IsValid 返回 false。它表明 OuterModels 的计数为 0。

即使我告诉表单在创建任何 InnerModels 之前提交 OuterModels = Model,您仍会认为 OuterModels 中仍有数据,因为它已传递给视图。我今天真的很累,所以我猜我正在查看一个(或多个)小细节。有什么建议么?

- 编辑 -

将 OuterModel 列表传递给控制器​​可能不是最好的方法。如果有人有更好的建议,请分享。

4

1 回答 1

1

只要正确使用索引,这应该不是问题。这是我设想表单名称的方式。

型号[0].foo

模型[0].Inner[0].bar

模型[0].Inner[1].bar

其中外部模型有一个名为 foo 的属性,而外部模型有一个名为 inner 的属性,它是内部对象的集合。内部对象有一个名为 bar 的属性。如果您的表单使用正确的索引呈现,那么模型绑定应该可以工作。如果表单字段是在客户端生成的,事情会变得很棘手。我建议返回服务器以操作模型。有一些额外的往返,但您可以通过 Ajax 请求进行。

这是一个更充实的示例中的更多细节。

public class InnerModel{
    public string Name{get; set;}
}

public class OuterModel{
   public List<InnerModel> InnerModels{get; set;}
   public string Name{get; set;}
}

以下是我设想的我的观点:

@model IEnumerable<OuterModel>

<ul>
  @{int i = 0;}
  @foreach(var item in Model){
     <li>
        Outer Name : @Html.TextBoxFor(m=>Model[i].Name)
        <br />
        @{int j = 0;}
        <ul>
            @foreach(var innerItem in Model[i].InnerModels){
               <li>Inner Name : @Html.TextBoxFor(m=> Model[i].InnerModels[j].Name)</li>
               j++;

            }
        </ul> 
        i++;
     </li>
  }
</ul>

如果它被包装在一个表单中---并且控制器动作如下所示:

public ActionResult Action(List<OuterModel> model){
}

那么我认为模型会正确填充。

我注意到你的表格..它看起来不对我......我不认为像这样传递 OuterModels 会起作用 - 尽管坦率地说我可能是错的。

@using (Html.BeginForm("Create", "Controller", new { OuterModels = Model }, FormMethod.Post))
{
   //Code to create the InnerModels here
}

这是我为我教的课做的一个例子..这绝对有效..

public class Author
{
    public string Name { get; set; }
}

public class Book
{
    public string Name { get; set; }

    public List<Author> Authors { get; set; }
}

控制器:

public class BookController : Controller
{

    public static List<Book> _model = null;

    public List<Book> Model
    {
        get
        {
            if (_model == null)
            {
                _model = new List<Book>
                {
                    new Book{
                        Name = "Go Dog Go", 
                        Authors = new List<Author>{
                            new Author{Name = "Dr. Seuss"}
                        }},
                    new Book{
                        Name = "All the Presidents Men", 
                        Authors = new List<Author>{
                            new Author{Name = "Woodward"},
                            new Author{Name = "Bernstein"}
                        }},
                    new Book{
                        Name = "Pro ASP.NET MVC Framework", 
                        Authors = new List<Author>{
                            new Author{Name = "Sanderson"},
                            new Author{Name = "Stewart"},
                            new Author {Name = "Freeman"}
                        }}
                };
            }
            return _model;
        }
    }

    public ActionResult Index()
    {
        return View(Model);
    }

    public ActionResult Edit()
    {
        return View(Model);
    }

    [HttpPost]
    public ActionResult Edit(List<Book> books)
    {
        _model = books;
        return RedirectToAction("Index");
        //return View(books);
    }

}

和查看:

@model List<AmazonWeb.Models.Book>
@{
    ViewBag.Title = "Index";
}

<div class="content">

@Html.ActionLink("Index", "Index")

@using (Html.BeginForm())
{
  <input type="submit" value="save" />
<ul class="book-list">

@for (var i = 0; i < Model.Count; i++ )
{
    <li>
        <label>Book Name</label> : @Html.TextBoxFor(m => Model[i].Name)
        <ul>
            @for (var j = 0; j < Model[i].Authors.Count; j++ )
            {
                <li><label>Author Name</label> : @Html.TextBoxFor(m => Model[i].Authors[j].Name)</li>
            }
        </ul>
    </li>
}
</ul>
    <input type="submit" value="save" />
}
</div>
于 2012-07-10T21:41:19.647 回答