我的控制器视图模型未使用我的动态视图模型填充

时间:2011-08-22 08:56:26

标签: asp.net-mvc-3

我正在创建一个允许我记录食谱的应用程序。我试图创建一个允许我添加配方基础的视图,例如食谱名称,食谱日期,温度在&使用的成分。

我正在创建一个包含一些jquery的视图来加载部分视图客户端。

在post im上有一些麻烦试图从使用jquery加载的局部视图中获取值。

我的主视图的缩减版本看起来像(我最初想要加载1个局部视图)

 <div id="ingredients">
         @{ Html.RenderPartial("_AddIngredient", new IngredientViewModel()); }
    </div>
    <script type="text/javascript">
    $(document).ready(function () {
    var dest = $("#ingredients");
    $("#add-ingredient").click(function () {
        loadPartial();
    });
    function loadPartial() {
        $.get("/Recipe/AddIngredient", {}, function (data) { $('#ingredients').append(data); }, "html");
    };
});
</script>

我的部分视图看起来像

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

控制器帖子

  [HttpPost]
    public ActionResult Create(RecipeViewModel vm,IEnumerable<string>IngredientName,  IEnumerable<string> MeasurementAmount, IEnumerable<string> MeasurementType)
    {

最后我的viewmodel看起来像

 public class IngredientViewModel
{
    public RecipeModel RecipeModel { get; set; }
    public IEnumerable<IngredientModel> Ingredients { get; set; }

}

我的控制器非常难看......我正在使用Inumerble获取MeasurementAmount和amp;的值。 MeasurementType(IngredientName总是返回null),理想情况下我认为httppost上的所有内容都会填充我可以填充成分

如何将部分视图中的值导入控制器?

5 个答案:

答案 0 :(得分:2)

为什么不看看MVC Controlstoolkit

我认为他们会做你想做的事。

答案 1 :(得分:0)

没有太多细节。您可以更改public ActionResult Create以使用FormCollection而不是视图模型吗?这将允许您查看通过的数据(如果有)。如果你可以发布它会有所帮助。

使用Binding填充您的视图模型 - 如果您还没有阅读过它,那么这样做可能是个好主意。最后,我会考虑将您的列表或枚举包装到单个视图模型中。

答案 2 :(得分:0)

可能出现的问题

问题可能在于您刚刚渲染的新Partial与之后发布的ViewModel没有正确绑定。

如果你用firebug检查元素,那么Partial中的元素应该命名为/ Id'ed,如下所示: Ingredients [x] .Property1,Ingredients [x] .Property2 等< / p>

在你添加部分的情况下,他们可能只被称为 Property1,Property2

可能的解决方案

为您的属性提供与您的成分列表对应的正确名称。像这样:

@Html.TextBox("Ingredients[x].Property1","")

在呈现部分之后,只需将ID为jquery的所有名称更改为正确的值。

答案 3 :(得分:0)

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

此外,您应该实现将集合绑定到MVC控制器的正确方法。您可以在Phil's Haack post

中找到示例

答案 4 :(得分:0)

假设RecipeViewModel是提供给局部视图的模型,请尝试在POST控制器中接受它,如下所示:

[HttpPost]
public ActionResult Create(RecipeViewModel vm)
{
  //
}

您应该使用表单中提供的所有值填充模型。