更新:
@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" })
}
答案 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
的值与您生成的其中一个选项的值相匹配,则首次渲染页面时将选择该项目。