如何从MVC3中的下拉列表中获取所选值

时间:2012-05-08 14:30:31

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

这可能听起来很简单,但我却陷入了一个非常奇怪的问题。

我在我的应用程序中创建了下拉列表,但我无法在编辑时获取所选值。

这是我的观点:

<div class="editor-field">
      @Html.DropDownListFor(model => model.Hobbyhome.HobbyHomeAddressList.First().ProvincialState.ProvincialStateID, new SelectList(ViewBag.State, "ProvincialStateID", "ProvincialStateName"), "-----Select State-----", new { @id = "State" })<font color="red">*</font> 
      </div>

我在控制器中写了一个函数来获取值,我也可以获取值但是当它进入View时它不会显示值 我创建了另一个这样的下拉列表:

  @Html.DropDownListFor(model => model.Hobbydetail.Hobbymaster.HobbyId, new SelectList(ViewBag.Hobby, "HobbyId", "HobbyName"), "----Select Hobby----", new { @id = "Hobby" })<font color="red">*</font> 

奇怪的是,我可以看到第二次下拉的价值,但不是第一次下注
我的想法可能是因为我在第一个下拉列表中使用了 list.First(),因此很容易出现这个问题bcoz在编辑视图页面上它只显示“-----选择状态 - - “作为第一次下拉的价值。
请帮帮我

2 个答案:

答案 0 :(得分:0)

要在编辑视图中获取“选定值对象”:

@Html.DropDownListFor(model => model.Hobbydetail.Hobbymaster.HobbyId, 
    new SelectList(ViewBag.Hobby, "HobbyId", "HobbyName", Model.Hobbydetail.Hobbymaster.HobbyId),
    "----Select Hobby----", new { @id = "Hobby" })

要在DropDown中包含所有元素,请确保在显示编辑视图之前初始化ViewBag.Hobby并将其填充到控制器中!

答案 1 :(得分:0)

First()方法返回序列的第一个元素。如果源序列为空,它将抛出异常。

为什么你需要在那里使用First()?我认为你是以错误的方式做的。你的DropDownListFor的第一个参数应该是一个保存所选值的变量,在你正在使用的这个特殊超载中。

public static MvcHtmlString DropDownList(
    this HtmlHelper htmlHelper,
    string name,
    IEnumerable<SelectListItem> selectList,
    IDictionary<string, Object> htmlAttributes
)
  

name :要返回的表单字段的名称。

你应该使用第二种方法

我会制作一个干净的ViewModel来处理这个问题。 这使我的视图干净

public class AddHobbyViewModel
{
  public int SelectedHobbyId { set;get;}
  public IEnumerable<Hobby> Hobbys { set;get;}
  //other relevant properties for the View.  
}

在GET操作方法中,我不是在ViewBag中返回数据,而是在ViewModel中返回它。

public ActionResult Add()
{
  AddHobbyViewModel model=new AddHobbyViewModel ();
  model.Hobbys=db.Hobbies();  // get all available hobbies.

  return View(model);
}

在视图中,

 @Html.DropDownListFor(model => SelectedHobbyId , new SelectList(Hobbys , "HobbyId", "HobbyName"), "----Select Hobby----", new { @id = "Hobby" })

现在,您将在SelectedHobbyId属性中的httppost方法中获得所选值

[HttpPost]
public ActionResult Add(AddHobbyViewModel model)
{
  // check model.SelectedHobbyId here
}