我有两个类Entry和Paradigm。 Entry类具有ParadigmId和Paradigm属性。所以在我看来,我有@Model.Entry.Paradigm
。如何使用Paradigm模型的较新语法构建DropDownListFor?
// Entry Model
[Bind(Exclude = "EntryId")]
public class Entry
{
[ScaffoldColumn(false)]
public int EntryId { get; set; }
.
[Display(Name = "Type")]
public int ParadigmId { get; set; }
public virtual Paradigm Paradigm { get; set; }
}
// Paradigm Model
public class Paradigm
{
[ScaffoldColumn(false)]
public int ParadigmId { get; set; }
[Required]
public string Name { get; set; }
public List<Entry> Entries { get; set; }
}
在我看来,我有@Html.DropDownListFor(model => model.Entry.ParadigmId, model.Entry.Paradigm)
。但该模型属于Paradigm类型,而不是IEnumerable。由于Paradigm是我的类的一部分(对于Entity Framework Code First),我不需要使用大多数示例中列出的单独的ViewData / ViewBag。
我用Google搜索了一下,看到有人使用Helper / Extension方法将模型转换为SelectList。在我的模型中使用DropDownListFor的最佳方法是什么?
@* Create View *@
<div class="editor-label">
@Html.LabelFor(model => model.Entry.ParadigmId)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.Entry.ParadigmId, model.Entry.Paradigm)
@Html.ValidationMessageFor(model => model.Entry.ParadigmId)
</div>
答案 0 :(得分:1)
您的链接Entry.Paradigm延迟加载单个范例,即外键引用的范例。它不会加载数据库中的所有Paradigm。
如果您想拥有所有范例的下拉列表,请绑定到所选范例。然后,您将需要一个单独的ViewBag或Model属性,其中包含所有这些属性的列表。
答案 1 :(得分:0)
我一直在使用:
public abstract class DropdownVm
{
/// <summary>
/// Set up a dropdown with the indicated values
/// </summary>
/// <param name="value">the current value, for determining selection</param>
/// <param name="options">list of options to display</param>
/// <param name="prependLabelAndValues">list of alternating label/value entries to insert to the beginning of the list</param>
public List<SelectListItem> SetDropdown<T>(T value, IEnumerable<KeyValuePair<T, string>> options, params object[] prependLabelAndValues)
{
var dropdown = options.Select(o => new SelectListItem { Selected = Equals(o.Key, value), Value = o.Key.ToString(), Text = o.Value }).ToList();
// insert prepend objects
for (int i = 0; i < prependLabelAndValues.Length; i += 2)
{
dropdown.Insert(0, new SelectListItem { Text = prependLabelAndValues[i].ToString(), Value = prependLabelAndValues[i + 1].ToString() });
}
return dropdown;
}
}
/// <summary>
/// ViewModel with a single dropdown representing a "single" value
/// </summary>
/// <typeparam name="T">the represented value type</typeparam>
public class DropdownVm<T> : DropdownVm
{
/// <summary>
/// Flag to set when this instance is a nested property, so you can determine in the view if `!ModelState.IsValid()`
/// </summary>
public virtual bool HasModelErrors { get; set; }
/// <summary>
/// The user input
/// </summary>
public virtual T Input { get; set; }
/// <summary>
/// Dropdown values to select <see cref="Input"/>
/// </summary>
public virtual List<SelectListItem> Dropdown { get; set; }
/// <summary>
/// Set up <see cref="Dropdown"/> with the indicated values
/// </summary>
/// <param name="availableOptions">list of options to display</param>
/// <param name="prependLabelAndValues">list of alternating label/value entries to insert to the beginning of the list</param>
public virtual void SetDropdown(IEnumerable<KeyValuePair<T, string>> availableOptions, params object[] prependLabelAndValues)
{
this.Dropdown = SetDropdown(this.Input, availableOptions, prependLabelAndValues);
}
public override string ToString()
{
return Equals(Input, default(T)) ? string.Empty : Input.ToString();
}
}
您使用以下内容创建:
var vm = new DropdownVm<string>();
vm.SetDropdown(new Dictionary<string, string> {
{ "option1", "Label 1" },
{ "option2", "Label 2" },
}, "(Choose a Value)", string.Empty);
或者,更具体地说,在您的情况下:
var models = yourDataProvider.GetParadigms(); // list of Paradigm
var vm = new DropdownVm<int>();
vm.SetDropdown(
models.ToDictionary(m => m.ParadigmId, m => m.Name),
"(Choose a Value)", string.Empty
);
在视图中渲染:
<div class="field">
@Html.LabelFor(m => m.Input, "Choose")
@Html.DropDownListFor(m => m.Input, Model.Dropdown)
@Html.ValidationMessageFor(m => m.Input)
</div>