带Razor的嵌套对象表单

时间:2013-07-17 19:13:06

标签: asp.net-mvc asp.net-mvc-4 razor

我试图实现一种如何正确输入食谱的方法,到目前为止,我有以下内容:

Recipe.cs

public class Recipe
{
    [Key]
    public int RecipeId { get; set; }
    [Required]
    public string Name { get; set; }
    public string Subtitle { get; set; }
    public int Serving { get; set; }
    public string Instructions { get; set; }
    public virtual ICollection<Ingredient> Ingredients
}

Ingredient.cs

public class Ingredient
{
    [Key]
    public int IngredientId { get; set; }
    public string Name { get; set; }
    public string Amount { get; set; }
    public virtual ICollection<Recipe> Recipes { get; set; }
}

在我的表单中,我想添加成分内联,使用JavaScript在需要时渲染一对新字段。

  

(ViewModel只是一个持有Recipe实例的类)

Create.cshtml

 @model Vineyard.WebUI.Areas.Admin.Models.RecipeViewModel
 <div class="span9">
    <h2>Create a new Recipe</h2>
    @using (@Html.BeginForm("Create", "Recipes", FormMethod.Post))
    {
        <fieldset>
            @Html.LabelFor(r => r.Recipe.Name)
            @Html.TextBoxFor(r => r.Recipe.Name)
        </fieldset>
        <fieldset>
            @Html.LabelFor(r => r.Recipe.Subtitle)
            @Html.TextBoxFor(r => r.Recipe.Subtitle)
        </fieldset>
        <div id="ingredients">
            @Html.EditorFor(r => r.Recipe.Ingredients, "Ingredient")
        </div>
        <a href="#" id="addIngredient" class="btn btn-info">Add Ingredient</a>
        <fieldset>
            @Html.LabelFor(r => r.Recipe.Serving)
            @Html.TextBoxFor(r => r.Recipe.Serving)
        </fieldset>
        <fieldset>
            @Html.LabelFor(r => r.Recipe.Instructions)
            @Html.TextAreaFor(r => r.Recipe.Instructions)
        </fieldset>
        <input type="submit" value="Save Recipe" />
    }
  </div>

共享/ EditorTemplates / Ingredient.cshtml

@model Vineyard.Core.Entities.Ingredient

<div class="ingredient form-inline">
  @Html.LabelFor(r => r.Amount)
  @Html.TextBoxFor(r => r.Amount)
  @Html.LabelFor(r => r.Name)
  @Html.TextBoxFor(r => r.Name)
</div>

在呈现的HTML艰难中,我看到以下内容:

<input id="Recipe_Ingredients_Amount" name="Recipe.Ingredients.Amount" type="text" value="">

这使我相信,它不会将成分添加为集合的成员,而是作为一个完整的对象本身。它不应该有引用它的索引吗? (基于此http://jarrettmeyer.com/post/2995732471/nested-collection-models-in-asp-net-mvc-3

当我查看模型时,将传递回控制器,成分部分为null

所以,我想知道 - 我在这里错过了什么或做错了什么,可以改为实际填充Collection正确?从那里,我可以在控制器中处理它,以正确的格式保存。

1 个答案:

答案 0 :(得分:1)

更改

public virtual ICollection<Ingredient> Ingredients

public IEnumerable<Ingredient> Ingredients { get; set; } 

(丢失虚拟广告并将ICollection更改为IEnumerable)。

此外,在您的控制器中,使用单个项目预先填充成分列表(用于测试),否则HTML中不会显示任何内容。

此答案已从我的评论转换