Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net MVC3-将带有动态数据的整个模型从视图传递到控制器_Asp.net_Asp.net Mvc_Asp.net Mvc 3_Model Binding - Fatal编程技术网

Asp.net MVC3-将带有动态数据的整个模型从视图传递到控制器

Asp.net MVC3-将带有动态数据的整个模型从视图传递到控制器,asp.net,asp.net-mvc,asp.net-mvc-3,model-binding,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Model Binding,我有两种型号:外层型号和内层型号。外部模型和内部模型之间分别存在一对多关系。为了澄清我的问题,我的模型是IEnumerable类型。我将随机数量的外部模型传递给视图,用户为每个外部模型创建任意数量的内部模型。然后在提交时,我希望控制器接收外部模型的列表,以便可以将内部模型添加到数据库中,并添加到其预期的外部模型中 我相信我有正确的命名约定来使用MVC的内置模型绑定。下面是它的样子: OuterModel[i].InnerModel[j].Property 我的问题是,我真的不知道如何将外部模型

我有两种型号:外层型号和内层型号。外部模型和内部模型之间分别存在一对多关系。为了澄清我的问题,我的模型是IEnumerable类型。我将随机数量的外部模型传递给视图,用户为每个外部模型创建任意数量的内部模型。然后在提交时,我希望控制器接收外部模型的列表,以便可以将内部模型添加到数据库中,并添加到其预期的外部模型中

我相信我有正确的命名约定来使用MVC的内置模型绑定。下面是它的样子:

OuterModel[i].InnerModel[j].Property
我的问题是,我真的不知道如何将外部模型列表传递给控制器。以下是我在我看来尝试过的:

    @model IEnumerable<OuterModel>

    @using (Html.BeginForm("Create", "Controller", new { OuterModels = Model }, FormMethod.Post))
    {
       //Code to create the InnerModels here
    }
@model IEnumerable
@使用(Html.BeginForm(“Create”,“Controller”,new{OuterModels=Model},FormMethod.Post))
{
//在此处创建内部模型的代码
}
以下是我控制器中的内容:

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

}
[HttpPost]
公共操作结果创建(IEnumerable外部模型,FormCollection fc)
{
字符串[]键=fc.AllKeys;
if(ModelState.IsValid){
//添加到数据库
}
}
键显示我的所有属性都遵循我先前指定的命名约定,但ModelState.IsValid返回false。它显示最外层模型的计数为0

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

--编辑--


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

只要索引使用得当,这就不应该成为问题。下面是我对表单名称的设想

模型[0]。foo

模型[0]。内部[0]。条形图

模型[0]。内部[1]。条形图

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

下面是一个更加充实的示例中的更多细节

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

public class OuterModel{
   public List<InnerModel> InnerModels{get; set;}
   public string Name{get; set;}
}
这是我为我所教的班级做的一个例子。。那肯定有效

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

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

    public List<Author> Authors { get; set; }
}
公共类作者
{
公共字符串名称{get;set;}
}
公共课堂用书
{
公共字符串名称{get;set;}
公共列表作者{get;set;}
}
控制器:

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

}
公共类BookController:控制器
{
公共静态列表_model=null;
公共列表模型
{
得到
{
如果(_model==null)
{
_模型=新列表
{
新书{
Name=“Go Dog Go”,
作者=新列表{
新作者{Name=“Dr.Seuss”}
}},
新书{
Name=“所有总统先生”,
作者=新列表{
新作者{Name=“Woodward”},
新作者{Name=“Bernstein”}
}},
新书{
Name=“Pro ASP.NET MVC Framework”,
作者=新列表{
新作者{Name=“Sanderson”},
新作者{Name=“Stewart”},
新作者{Name=“Freeman”}
}}
};
}
回归模型;
}
}
公共行动结果索引()
{
返回视图(模型);
}
公共行动结果编辑()
{
返回视图(模型);
}
[HttpPost]
公共行动结果编辑(书籍列表)
{
_模型=书籍;
返回操作(“索引”);
//返回视图(书籍);
}
}
和视图:

@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>
@型号列表
@{
ViewBag.Title=“Index”;
}
@ActionLink(“索引”、“索引”)
@使用(Html.BeginForm())
{
    @对于(var i=0;i 书名:@Html.TextBoxFor(m=>Model[i].Name)
      @对于(var j=0;j作者姓名:@Html.TextBoxFor(m=>Model[i]。作者[j]。姓名) }
    }
}
My indice值是正确的,表单实际上是通过AJAX请求创建的,该请求为新的一行编辑器字段呈现部分视图。这很有帮助,但与我的要求相差不远。我没有显式地传递控制器操作的参数,而是将其保留为null。换句话说,我将新的{OuterModel=Model}更改为null。现在,我的InnerModel数据被传递到ModelState,但是原始的OuterModel数据没有显示出来。今天是漫长的一天。我明天会解决这个问题。谢谢你提供了一个有效的例子。在我的例子中,我需要将参数传递到using语句中,因为我需要显式地声明这是一个POST操作。否则,来自PartialView的数据将无法传递到控制器。出于某种原因,我认为我需要在using语句中将模型作为参数传递。显然,这就是造成我问题的原因。不管怎样,问题现在已经解决了。你必须在这里发布代码来创建内部模型。我不太愿意发布我的代码,因为这段代码与实际问题无关。我的问题出在爸爸身上
@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>