如何将@ Html.TextBoxFor转换为@ Html.DropDownList?

时间:2013-03-06 19:01:35

标签: asp.net-mvc asp.net-mvc-4

我有一个使用文本框输入的视图。我需要换出文本框并使用下拉列表。只有三个,我想手工制作而不是代码生成并重新应用任何调整。

我对数据库进行了更改。我将字段更改为FK的int而不是varchar(50)。

我更新了EF数据模型并确认FK已正确映射。

我在视图中更改了标记。我从此应用程序的其他位置复制了此下拉列表的代码。

    <div class="LabelAndField">
        <div class="editor-label-score">
            @Html.LabelFor(model => model.FootLateralDominanceLateralityId)
        </div>
        <div class="editor-field-score">
            @Html.DropDownList("LateralDominanceLaterality", String.Empty)
            @Html.ValidationMessageFor(model => model.FootLateralDominanceLateralityId)
        </div>
    </div>

我将以下代码添加到viewmodel:

public virtual LateralDominanceLaterality LateralDominanceLaterality { get; set; }
public virtual LateralDominanceLaterality LateralDominanceLaterality1 { get; set; }
public virtual LateralDominanceLaterality LateralDominanceLaterality2 { get; set; }

当我运行应用程序并导航到此视图时,我得到以下异常:

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'LateralDominanceLaterality'.

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

它缺少您未传递给DropDownList的数据源。 上的DropDownList与名为SelectList的类一起使用,您可以将IEnumerable的任何实现传递给它,以及要在此控件上绑定的值和文本的属性名称。尝试这样的事情:

1)在控制器上使用您的属性名称在ViewBag上设置一个键

var list = /* build an List you want to show, for sample: List<LateralDominanceLaterality> */;

// create a SelectList to fill the combo with the sintax of the .ctor (list, value property, text property), e.g.:
var items = new SelectList(list, "Id", "Description");

// set on the ViewBag
ViewBag.LateralDominanceLaterality = items;

2)在View上,您可以这样做:

@Html.DropDownListFor(model => model.LateralDominanceLaterality, ViewBag.LateralDominanceLaterality)

答案 1 :(得分:1)

即使现在它是3,但将来可能会增加。因此,不要通过向视图模型添加3个属性来硬编码3个项目。你应该做的是在你的viewmodel中保留一个集合,根据需要在其中包含n个项目。还要尽量避免像ViewBag和ViewData这样的动态内容。使用强类型方法。所以让我们像这样改变你的viewmodel

public class CustomerViewModel
{
  //Your other existing properties of the viewmodel  goes here

  public List<SelectListItem> Lateralities { set;get;}
  public int SelectedLaterality { set;get;}

  public CustomerViewModel()
  {
    Lateralities =new List<SelectListItem>();
  }
}

现在,在您的GET Action方法中,设置Lateralities集合的项目,并将viewmodel对象发送到我们的视图。

public ActionResult Add()
{
   var vm=new CustomerViewModel();

 //The below is hard code for adding 3 items to the collection. 
 //You may replace it with data from your table/data access layer

   vm.Lateralities.Add(new SelectListItem { Value="1", Text="Item 1"});
   vm.Lateralities.Add(new SelectListItem { Value="2", Text="Item 2"});
   vm.Lateralities.Add(new SelectListItem { Value="3", Text="Item 3"});

   return View(vm);
}

并且在我们强烈输入CustomerViewmodel的视图中,使用Html.DropDownListFor辅助方法

@model CustomerViewModel
@using(Html.Beginform())
{
  @Html.DropdownListFor(x=>x.SelectedLaterality,
                   new SelectList(Model.Lateralities,"Value","Text"),"select")
  <input type="submit" />    
}

发布表单后,所选项ID将位于CustomerViewModel的SelectedLaterality属性中。

[HttpPost]
public ActionResult Add(CustomerViewModel model)
{
  // check model.SelectedLaterality
  //to do : Save and redirect.
}