我发现了几个关于我的问题的问题,但是没有一个问题能够解决问题并为问题提供替代解决方案,这就是为什么我再次问这个问题。
我使用强类型HTML帮助程序,而不使用ViewData和ViewBag仅用于页面标题。
这是我的问题。
我有以下viewmodel。
public class RegisterViewModel
{
public string Mail { get; set; }
public string Name { get; set; }
public ThreePartDatePickerViewModel ThreePartDateSelection { get; set; }
public RegisterViewModel()
{
ThreePartDateSelection = new ThreePartDatePickerViewModel();
}
}
以上viewmodel使用下面的viewmodel,它基本上保存3个下拉列表的数据,即日,月和年。
public class ThreePartDatePickerViewModel
{
public string Day { get; set; }
public string Year { get; set; }
public string Month { get; set; }
public IList<SelectListItem> Years { get; set; }
public IList<SelectListItem> Months { get; set; }
public IList<SelectListItem> Days { get; set; }
public ThreePartDatePickerViewModel()
{
var now = DateTime.Now;
Years = new List<SelectListItem>();
Months = new List<SelectListItem>();
Days = new List<SelectListItem>();
var empty = new SelectListItem { Text = "" };
Years.Add(empty);
Months.Add(empty);
Days.Add(empty);
foreach(var item in Enumerable.Range(0, 100).Select(x => new SelectListItem { Value = (now.Year - x).ToString(), Text = (now.Year - x).ToString() }))
Years.Add(item);
foreach(var item in Enumerable.Range(1, 12).Select(x => new SelectListItem { Value = x.ToString(), Text = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x) }))
Months.Add(item);
foreach(var item in Enumerable.Range(1, 31).Select(x => new SelectListItem { Value = x.ToString(), Text = x.ToString() }))
Days.Add(item);
}
}
在返回RegisterViewModel
进行查看的操作方法中,我设置了ThreePartDatePickerViewModel
的日,月和年属性。
我在运行时检查了这些值,同时生成了视图并且它们是正确的。
在我的主视图中,
@model Bla.Bla.RegisterViewModel
<!-- Helpers for other properties -->
@Html.EditorFor(m => m.ThreePartDateSelection)
我的ThreePartDatePickerViewModel编辑器模板是
@model Bla.Bla.ThreePartDatePickerViewModel
<div class="threePartDatePicker">
@Html.DropDownListFor(m => m.Day, Model.Days)
@Html.DropDownListFor(m => m.Month, Model.Months)
@Html.DropDownListFor(m => m.Year, Model.Years)
</div>
在我最终渲染的html中,我按预期拥有所有控件。下拉列表正常,但未选中我在操作方法中设置的值。
如果我从EditorTemplates切换到部分视图,它就会开始工作。或者,如果直接在主视图中呈现下拉列表,而不是将模型传递给EditorFor,它将再次起作用。
答案 0 :(得分:4)
这似乎是一个旧的错误,尚未解决。据报道。
我必须编辑编辑器模板以将选定值设置为
@{
//capture the selected list wherever it is. Here it passed in additionalViewData
SelectList tmpList, list = null;
ViewContext.ViewData.TryGetValue("list", out tmpList);
if (tmpList != null && tmpList.Count() > 0 && tmpList.SelectedValue == null)
{
list = new SelectList(tmpList, "Value", "Text", Model);
}
else
{
list = tmpList;
}
}
<div class="form-group">
@Html.DropDownListFor(m => m, list, attributes)
</div>
所以我可以使用编辑器模板中的选择列表作为默认行为。
答案 1 :(得分:2)
我在编辑器模板中使用下拉列表遇到了同样的问题。即使我可以在模型中看到正确的值,也不会设置所选的值。这是我的解决方法。它可以扩展为与其他DropdownListFor
方法一起使用。
public static class HtmlHelperExtensions
{
public static IHtmlString EditorDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel)
{
var dropDown = SelectExtensions.DropDownListFor(htmlHelper, expression, selectList, optionLabel);
var model = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model;
if (model == null)
{
return dropDown;
}
var dropDownWithSelect = dropDown.ToString().Replace("value=\"" + model.ToString() + "\"", "value=\"" + model.ToString() + "\" selected");
return new MvcHtmlString(dropDownWithSelect);
}
}