我有一个应用程序,我有食谱和标签。由于食谱可以有多个标签,而标签可以属于多个食谱,我有以下模型:
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; }
}
My 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()方法填充。但是,我不清楚我应该如何向视图模型添加一个集合,以便它可以在视图中浮出水面。这是我当前的viewmodel:
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中表示复杂对象集合的指导,我会很感激!
谢谢,
克里斯
答案 0 :(得分: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进行协调。
这种方法的唯一缺点是你需要一些单独的代码来创建新标签。但你没有提到这是一个要求。
希望有所帮助!