Asp.net mvc 3 我的控制器视图模型是';我的动态视图模型尚未填充

Asp.net mvc 3 我的控制器视图模型是';我的动态视图模型尚未填充,asp.net-mvc-3,Asp.net Mvc 3,我正在创建一个允许我记录食谱的应用程序。我试图创建一个视图,允许我添加配方的基本信息,例如配方名称、配方日期、烹调温度和使用的配料 我正在创建一个视图,其中包含一些jquery以加载部分视图客户端 在post上,我在尝试从使用jquery加载的部分视图中获取值时遇到了一些问题 我的主视图的精简版本如下(我最初希望加载1个局部视图) @{Html.RenderPartial(“_AddIngredient”,new IngredientViewModel());} $(文档).ready(函数(

我正在创建一个允许我记录食谱的应用程序。我试图创建一个视图,允许我添加配方的基本信息,例如配方名称、配方日期、烹调温度和使用的配料

我正在创建一个视图,其中包含一些jquery以加载部分视图客户端

在post上,我在尝试从使用jquery加载的部分视图中获取值时遇到了一些问题

我的主视图的精简版本如下(我最初希望加载1个局部视图)


@{Html.RenderPartial(“_AddIngredient”,new IngredientViewModel());}
$(文档).ready(函数(){
var dest=$(“#成分”);
$(“#添加成分”)。单击(功能(){
loadPartial();
});
函数loadPartial(){
$.get(“/Recipe/addingredent”,{},函数(数据){$('#配料').append(数据);},“html”);
};
});
我的部分观点看起来像

<div class="ingredient-name">
   @Html.LabelFor(x => Model.IngredientModel.IngredientName)
   @Html.TextBoxFor(x => Model.IngredientModel.IngredientName)
</div>
<div class="ingredient-measurementamount">
   @Html.LabelFor(x => Model.MeasurementAmount)
   @Html.TextBoxFor(x => Model.MeasurementAmount)
</div>
<div class="ingredient-measurementtype">
  @Html.LabelFor(x => Model.MeasurementType)
  @Html.TextBoxFor(x => Model.MeasurementType)
</div>
 public class IngredientViewModel
{
    public RecipeModel RecipeModel { get; set; }
    public IEnumerable<IngredientModel> Ingredients { get; set; }

}

@LabelFor(x=>Model.IngredientModel.IngredientName)
@Html.TextBoxFor(x=>Model.IngredientModel.IngredientName)
@LabelFor(x=>Model.MeasurementAmount)
@Html.TextBoxFor(x=>Model.MeasurementAmount)
@LabelFor(x=>Model.MeasurementType)
@Html.TextBoxFor(x=>Model.MeasurementType)
控制站

  [HttpPost]
    public ActionResult Create(RecipeViewModel vm,IEnumerable<string>IngredientName,  IEnumerable<string> MeasurementAmount, IEnumerable<string> MeasurementType)
    {
[HttpPost]
公共操作结果创建(RecipeViewModel vm、IEnumerableIngredientName、IEnumerable MeasurementAmount、IEnumerable MeasurementType)
{
最后,我的viewmodel看起来像

<div class="ingredient-name">
   @Html.LabelFor(x => Model.IngredientModel.IngredientName)
   @Html.TextBoxFor(x => Model.IngredientModel.IngredientName)
</div>
<div class="ingredient-measurementamount">
   @Html.LabelFor(x => Model.MeasurementAmount)
   @Html.TextBoxFor(x => Model.MeasurementAmount)
</div>
<div class="ingredient-measurementtype">
  @Html.LabelFor(x => Model.MeasurementType)
  @Html.TextBoxFor(x => Model.MeasurementType)
</div>
 public class IngredientViewModel
{
    public RecipeModel RecipeModel { get; set; }
    public IEnumerable<IngredientModel> Ingredients { get; set; }

}
公共类InCreditViewModel
{
公共RecipeModel RecipeModel{get;set;}
公共IEnumerable成分{get;set;}
}
我的控制器非常难看……我使用Inumerble获取MeasurementAmount&MeasurementType的值(IngreditName始终返回null),理想情况下,我认为httppost上的成分将填充所有我可以填充的成分


我需要做什么才能将部分视图中的值获取到控制器中?

而不需要太多细节。您能否将
public ActionResult Create
更改为使用FormCollection而不是视图模型?这将允许您查看正在通过的数据(如果有的话)。如果您可以发布这些数据,将有所帮助


你的视图模型是通过使用绑定来填充的——如果你还没有读过它,那么这样做可能是个好主意。最后我会考虑把你的列表或枚举打包成一个单一的视图模型。

< P> <强>可能的问题< /强>

问题可能在于您刚才渲染的新局部未正确绑定到您稍后发布的ViewModel

如果您使用firebug检查元素,则部分中的元素应命名为/Id,如下所示:成分[x].Property1,成分[x].Property2

在您的情况下,当您添加一个部分时,它们可能只是被称为属性1,属性2

可能的解决方案

在您的部分中为您的属性指定与您的成分列表相对应的正确名称。如下所示:

@Html.TextBox("Ingredients[x].Property1","")
[HttpPost]
public ActionResult Create(RecipeViewModel vm)
{
  //
}

当然,在呈现部分视图后,只需使用jquery将所有名称en-ID更改为正确的值。

这是因为部分视图中的字段名称不符合默认的ModelBinder约定。您应该分析部分视图中的字段名称


您还应该实现将集合绑定到MVC控制器的正确方法


我想他们会做你想做的。

假设RecipeViewModel是提供给部分视图的模型,尝试在POST controller中接受它,如下所示:

@Html.TextBox("Ingredients[x].Property1","")
[HttpPost]
public ActionResult Create(RecipeViewModel vm)
{
  //
}
您应该使用表单中提供的所有值填充模型