MVC3中的下拉列表

时间:2013-04-10 15:17:36

标签: asp.net-mvc-3

我有一个表单想要从下拉列表中选择类别和标签并将其绑定到帖子,这是我的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>

请给我一个解决方案,谢谢

2 个答案:

答案 0 :(得分:1)

尽量避免像ViewBag和ViewData这样的动态内容。使用强类型视图。

ViewModel只是一个POCO类,我们将使用它来在视图和操作方法之间传输数据。它将特定于视图。

您有一个viewmodel,但您没有正确使用它。在viewmodel中添加2个属性,以便从下拉列表中获取所选项目。此外,我将您的属性名称更改为(CategoriesTags)的复数形式,因为它们用于存储集合。

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);
}

假设GetAllCategoriesGetAllTags是两种方法,它们会为类别和标签返回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>