我有一个表单想要从下拉列表中选择类别和标签并将其绑定到帖子,这是我的ViewModel:
public class PostViewModel
{
public IList<Category> Category { get; set; }
public IList<Tag> Tag { get; set; }
}
这是我的行动:
public ActionResult Add()
{
ViewBag.CategoryList = new SelectList(_categoryRepository.GetAllCategory());
ViewBag.TagList = new SelectList(_tagRepository.GetAllTag());
return View();
}
现在我怎样才能将Id dropdownlst发送到Post动作? :
<div>
@Html.LabelFor(post => post.Category)
@Html.DropDownListFor ????
@Html.ValidationMessageFor(post => post.Category)
</div>
我试过这个它没用的
<div>
@Html.LabelFor(post => post.Category)
@Html.DropDownListFor(post => post.Category, ViewBag.CategoryList as SelectList, "--- Select Category ---")
@Html.ValidationMessageFor(post => post.Category)
</div>
请给我一个解决方案,谢谢
答案 0 :(得分:1)
尽量避免像ViewBag和ViewData这样的动态内容。使用强类型视图。
ViewModel只是一个POCO类,我们将使用它来在视图和操作方法之间传输数据。它将特定于视图。
您有一个viewmodel,但您没有正确使用它。在viewmodel中添加2个属性,以便从下拉列表中获取所选项目。此外,我将您的属性名称更改为(Categories
,Tags
)的复数形式,因为它们用于存储集合。
public class PostViewModel
{
public List<SelectListItem> Categories{ get; set; }
public List<SelectListItem> Tags { get; set; }
public int SelectedCategory { set;get;}
public int SelectedTag { set;get;}
}
现在在GET
Action方法中,创建视图模型的对象并设置集合属性,然后使用View
方法将该对象发送到视图。
public ActionResult Add()
{
var vm=new PostViewModel();
vm.Categories= GetAllCategories();
vm.Tags= GetAllTags();
return View(vm);
}
假设GetAllCategories
和GetAllTags
是两种方法,它们会为类别和标签返回SelectListItem
的集合。
public List<SelectListItem> GetAllCategories()
{
List<SelectListItem> categoryList=new List<SelectListItem>();
categoryList.Add(new SelectListItem { Text = "Sample", Value = "1" });
// TO DO : Read from your dB and fill here instead of hardcoding
return categoryList;
}
并在您看来,
@model PostViewModel
@using(Html.BeginForm())
{
@Html.DropDownListFor(x => x.SelectedCategory,
new SelectList(Model.Categories,"Value","Text"), "Select")
@Html.DropDownListFor(x => x.SelectedTag,
new SelectList(Model.Tags,"Value","Text"), "Select")
<input type="submit" value="save" />
}
在您的HttpPost操作方法中,您可以在我们添加的2个属性中获取所选项目
[HttpPost]
public ActionResult Add(PostViewModel model)
{
if(ModelState.IsValid)
{
//check model.SelectedCategory and model.SelectedTag
//save and redirect
}
//to do :reload the dropdown again.
return View(model);
}
答案 1 :(得分:0)
你很亲密:
public class PostViewModel
{
public int CategoryId { get; set; } // <-- Altered
public int TagId { get; set; } // <-- Altered
}
<div>
@Html.LabelFor(post => post.Category)
@Html.DropDownListFor(post => post.CategoryId,
ViewBag.CategoryList as IEnumerable<SelectListItem>,
"--- Select Category ---")
@Html.ValidationMessageFor(post => post.Category)
</div>