在DropDownList中设置所选项目

时间:2014-10-31 14:37:08

标签: asp.net-mvc

我有一个从数据库获取的偏差项列表。该列表包含严重性,可能为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 值并且它们是正确的。在结果中有下拉列表,但没有选择任何内容。 这就是问题。你能给我一些想法吗?感谢。

1 个答案:

答案 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个选项。