0

我有一个应用程序,其中有食谱和标签。由于Recipes可以有多个Tags,并且Tags可以属于多个recipe,所以我有以下模型:

public class Tag : IModel
{
    [Key]
    public int ID { get; set; }
    [Required(ErrorMessage = "Name is required.")]
    public string Name { get; set; }
    public virtual ICollection<Recipe> Recipes { get;set; }
}

public class Recipe : IModel
{
    [Key]
    public int ID { get; set; }
    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    [Required(ErrorMessage = "The Title is required.")]
    public string Title { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
    public virtual Category Category { get; set; }
}

我的 Recipe 控制器有一个 HttpGet Edit 操作,它返回视图的配方:

public ActionResult Edit(int id = 0)
    {

        Recipe recipe = _recipeService.GetByID(id, "Category,Tags");
        if (recipe == null)
        {
            return HttpNotFound();
        }
        CreateEditRecipeViewModel viewModel = new CreateEditRecipeViewModel(recipe, PopulateCategoryLookup(recipe));
        return View(viewModel);
    }

此时,Recipe 的 Tag 集合由我的 GetById() 方法填充。但是,我不清楚我应该如何向视图模型添加一个集合,以便它可以在视图中出现。这是我当前的视图模型:

public class CreateEditRecipeViewModel
{        
    [HiddenInput]
    public int RecipeID { get; set; }
    public int CategoryId { get; set; }
    [Required(ErrorMessage = "The Title is required.")]
    public string Title { get; set; }
}

在我看来,我希望有一个文本框,其中有一个逗号分隔的标签列表(例如早餐、素食、无麸质)。当打开编辑视图时,我希望它填充当前分配给配方的每个标签的名称。发布表单后,我想拆分标签列表,并在 HttpPost 编辑操作中,将值与 EF 协调一致。

如果有人对在 ViewModel 和 View 中表示复杂对象的集合有指导,我将不胜感激!

谢谢,

克里斯

4

1 回答 1

1

我通常使用ListBoxFor标记结合Chosen jquery 插件来进行多选。惊人的简单。我将尝试一下这应该如何看待代码。但是我手头没有VS可以测试。就像是:

public class CreateEditRecipeViewModel
{        
    [HiddenInput]
    public int RecipeID { get; set; }
    public int CategoryId { get; set; }
    public List<int> TagIds { get; set; }
    [Required(ErrorMessage = "The Title is required.")]
    public string Title { get; set; }
}

//Then in view...

@Html.ListBoxFor(model => model.TagIds, HelperMethodToGetSelectListOfTags())

然后就像您提到的那样,当您将视图模型转回常规模型时,您只需将选定的 id 与 EF 协调即可。

这种方法的唯一缺点是您需要一些单独的代码来创建新标签。但你没有提到这是一项要求。

希望有帮助!

于 2013-01-01T20:09:32.980 回答