我有一个从数据库获取的偏差项列表。该列表包含严重性,可能为null。这就是为什么我使用 SeverityNotNull 属性将空值转换为-1。 BTW严重程度可以是0-3。
我想显示偏差项目,其中每个严重性应该逐行显示DropdownList。当然,在DropdownList中应该选择适当的项目。
我的ViewModel是:
[MetadataType(typeof(DeviationMetaData))]
public partial class Deviation {
public int SeverityNotNull {
get { return Severity == null ? -1 : Severity.Value; }
}
...
}
public class DeviationMetaData {
public Nullable<int> Severity { get; set; }
...
}
public class DeviationViewModel {
public Deviation Dev { set; get; }
public IEnumerable<Deviation> Deviations {
get {
DeviationRepository dm = new DeviationRepository();
return dm.GetAll;
}
}
public DeviationViewModel() {
WindowsIdentity current = WindowsIdentity.GetCurrent();
string name = current.Name.Split(new[] { '\\' })[1];
Dev = new Deviation { CreatedBy = name, CreatedDate = DateTime.Now };
}
}
我的控制器是:
public ActionResult Index() {
IList<SelectListItem> items = new List<SelectListItem> {
new SelectListItem{Text = "", Value = "-1"},
new SelectListItem{Text = "Minor", Value = "1"},
new SelectListItem{Text = "Major", Value = "2"},
new SelectListItem{Text = "Critical", Value = "3"}
};
ViewBag.SelectSeverity = new SelectList(items, "Value", "Text");
return View( new DeviationViewModel() );
}
我的观点是:
@model DeviationViewModel
@using (Html.BeginForm()) {
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Dev.Severity)
</th>
</tr>
@foreach (var item in Model.Deviations) {
<tr>
<td>
@Html.DropDownListFor(modelItem => item.SeverityNotNull, (SelectList)ViewBag.SelectSeverity)
</td>
</tr>
}
</table>
</fieldset>
}
</div>
我检查了 SeverityNotNull 值并且它们是正确的。在结果中有下拉列表,但没有选择任何内容。 这就是问题。你能给我一些想法吗?感谢。
答案 0 :(得分:1)
没有必要创建SeverityNotNull
属性。 SelectList
可以包含一个带有空值的选项,如果选中该值,则会返回null
。您还有其他多个问题,包括使用foreach
循环来呈现<selects>
具有重复name
属性(不会在回发上绑定)和重复id
属性(无效的html)
首先创建一个视图模型来表示Deviation
public class DeviationVM
{
public int ID { get; set; }
public int? Severity { get; set; }
// other properties of the Deviation data model that you want to edit/display
}
控制器
public ActionResult Index()
{
// Get your deviations and map to the view model
List<DeviationVM> model = dm.GetAll().Select(d => new DeviationVM
{
ID = d.ID,
Severity = d.Severity
}).ToList();
// create your select list (
var severityList = new[] { new { ID = 1, Name = "Minor" }, new { ID = 2, Name = "Major" }, new { ID = 2, Name = "Critical" } };
ViewBag.SeverityList = new SelectList(severityList, "ID", "Name");
return View(model)
}
public ActionResult(List<DeviationVM> model)
{
...
}
查看
@model List<DeviationVM>
@using (Html.BeginForm()) {
....
for(int i = 0; i < Model.Count; i++)
{
@Html.HiddenFor(m => m[i].ID)
@Html.DropDownListFor(m => m[i].Severity, (SelectList)ViewBag.SeverityList, "Text for null value")
}
请注意使用生成for
的{{1}}循环,该循环使用索引器正确命名,并将在回发时绑定。另请注意使用<select name="[0].Severity" ..> <select name="[1].Severity" ..>
的重载,它会生成@Html.DropDownListFor()
选项。第一个选项没有值,因此如果选中它,则在回发时属性<option value>Text for null value</option> <option value="1">Minor</option> ...
的值将为null。
另请注意,如果属性Severity
的值为initiallt null,则默认情况下将选择第一个选项。如果值为Severity
,则默认情况下将选择第3个选项。