Html.DropDownFor:模板只能用于字段访问,属性访问,单维

时间:2015-03-04 01:39:29

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

更新:

@Html.DropDownListFor(m = item.SelectedType, (IEnumerable<SelectListItem>)ViewBag.DropDownLoadRecoveryType, new { @class = "form-control" 

为什么我收到此错误:

  

模板只能用于字段访问,属性访问,   单维数组索引或单参数自定义索引器   表达

我在发布之前已经扫描了所有问题,但我已经陷入困境,我需要帮助。

这是我的模特:

public string SelectedType { get; set; }

这是我的控制器:

public static class RecoveryTypesDropDown
{
    public static IEnumerable<SelectListItem> RecoveryTypes { get; set; }
}

public void DropDownLoadRecoveryType()
{
   using (var context = new salt_entities())
   {
      var list = context.Types.OrderBy(b => b.Sort).ToList().Select(e => new { e.ID, e.Type });
      IEnumerable<SelectListItem> lists = list.Select(b => new SelectListItem { Value = b.ID.ToString().Trim(), Text = b.Type.Trim() }).ToList();
      RecoveryTypesDropDown.RecoveryTypes = lists;
    }
}

public ViewResult Collection(Guid id)
{
   ViewBag.DropDownLoadRecoveryType = RecoveryTypesDropDown.RecoveryTypes;
   //....
   foreach (var item in collectionViewModelList)
   {
     //....

     collectionViewModel.SelectedType = item.Type.Value;

   }

}

这是我的.html剃刀代码:

  @model IEnumerable<myapp.Models.CollectionViewModel>

  @foreach (var item in Model)
  {
     @Html.DropDownList(item.SelectedType.Trim(), (IEnumerable<SelectListItem>)ViewBag.DropDownLoadRecoveryType, new { @class = "form-control" })
  }

1 个答案:

答案 0 :(得分:0)

您最初的问题是在html帮助器中使用.Trim()。正如消息所述,帮助程序需要访问属性,但使用.Trim()意味着它访问属性上的方法(而不是属性本身),因此是异常。

此外,您不应该使用静态属性(不是线程安全的)。但是你遇到的主要问题是你没有正确构造你的html并使用id循环生成重复的name属性(无效的html)和foreach属性,因此绑定将失败。而是使用自定义EditorTemplate来填充CollectionViewModel

查看/共享/ EditorTemplates / CollectionViewModel.cshtml

@model CollectionViewModel
@Html.DropDownListFor(m => m.SelectedType, (SelectList)ViewData["RecoveryTypes"], new { @class = "form-control" })
// other controls for properties of CollectionViewModel

并在主视图中

@model IEnumerable<CollectionViewModel>
@using(Html.BeginForm())
{
  @Html.EditorFor(m => m, new { RecoveryTypes = ViewBag.RecoveryTypes })
  <input type="submit" /> 
}

在控制器中

public ViewResult Collection(Guid id)
{
  var list = context.Types.OrderBy(b => b.Sort);
  ViewBag.RecoveryTypes = new SelectList(list, "ID", "Type");
  IEnumerable<CollectionViewModel> model = ??
  ....
  return View(model);
}

[HttpPost]
public ViewResult Collection(IEnumerable<CollectionViewModel> model)
{
  // save and redirect
}

请注意,html现在将包含索引器,因此回发时可以绑定集合

<select name="[0].SelectedItem" ....>
<select name="[1].SelectedItem" ....>

如果属性SelectItem的值与您生成的其中一个选项的值相匹配,则首次渲染页面时将选择该项目。