不同的DropDownList同一EditorTemplate的选定值

时间:2016-11-21 19:37:13

标签: c# asp.net .net asp.net-mvc

我有一个包含以下内容的视图:

<div>
  @Html.EditorFor(model => model.Phone1)
</div>
<div>
  @Html.EditorFor(model => model.Phone2)
</div>
<div>
  @Html.EditorFor(model => model.Phone3)
</div>

这些字段中的每一个都是Phone类的实例。在EditorTemplate for Phone中我有:

@Html.DropDownList("PhoneTypeID", null, htmlAttributes: new { @class = "btn"})

在控制器中我有:

ViewBag.PhoneTypeID = new SelectList(db.PhoneTypes, "PhoneTypeID", "Type", PhoneTypeIDValue);

现在,三者中的每一个都在下拉列表中获得相同的选定值,因为它们使用相同的SelectList对象。

当我从控制器填充并使用相同的editorTemplate时,有没有办法可以为这三个下拉列表中的每个下拉列表赋予不同的选择值?

理想情况下,它看起来像这样:

ViewBag.Phone1.PhoneTypeID = new SelectList(db.PhoneTypes, "PhoneTypeID", "Type", Phone1.PhoneTypeIDValue);
ViewBag.Phone2.PhoneTypeID = new SelectList(db.PhoneTypes, "PhoneTypeID", "Type", Phone2.PhoneTypeIDValue);
ViewBag.Phone3.PhoneTypeID = new SelectList(db.PhoneTypes, "PhoneTypeID", "Type", Phone3.PhoneTypeIDValue);

然而,当我这样做时,我收到错误:

  

无法对空引用执行运行时绑定

3 个答案:

答案 0 :(得分:0)

我认为问题是你的方法。改变

ViewBag.Phone1.PhoneTypeID = new SelectList(db.PhoneTypes, "PhoneTypeID", "Type", Phone1.PhoneTypeIDValue);

要:

var phoneTypes = db.PhoneTypes!= null ? db.PhoneTypes.Select(phoneType=> new { PhoneTypeID= phoneType.Id, Type= phoneType.type }) : null;
 ViewBag.PhoneType1 = phoneTypes != null ? new SelectList(phoneTypes , "PhoneTypeID", "Type", phoneTypes.PhoneTypeIDValue) : null;

根据您的phoneType.Id属性将phoneType.typephoneTypes更改为专有名称。

答案 1 :(得分:0)

使用SelectListEditorTemplate的第二个参数)将您的共同aditionalViewData传递给EditorFor()

在GET方法中,使用

生成SelectList
ViewBag.PhoneTypeList = new SelectList(db.PhoneTypes, "PhoneTypeID", "Type");

请注意,属性的名称不应与绑定的属性相同(如果是,则丢失客户端验证),绑定到SelectList时,第4个参数将被忽略模特财产。

然后主视图中的代码应为

@Html.EditorFor(m => m.Phone1, new { phonelist = ViewBag.PhoneTypeList })
@Html.EditorFor(m => m.Phone2, new { phonelist = ViewBag.PhoneTypeList })

EditorTemplate

@Html.DropDownListFor(m => m.PhoneTypeID, (IEnumerable<SelectListItem>)ViewData["phonelist "]), new { @class = "btn" })

现在将根据PhoneTypeID属性的值选择每个下拉列表中的正确选项。

请注意,首选方法是使用包含SelectList属性的视图模型,而不是使用ViewBag

答案 2 :(得分:-1)

我刚刚在javascript中执行此操作。我将值放在TempData中然后在视图上我查看tempdata来设置值,所以它看起来如下所示:

控制器:

ViewBag.PhoneTypeID = new SelectList(db.PhoneTypes, "PhoneTypeID", "Type");
if(model.Phone1 != null)
{
   TempData["Phone1Type"] = model.Phone1.PhoneTypeID;
}
if (model.Phone2 != null)
{
    TempData["Phone2Type"] = model.Phone2.PhoneTypeID;
}

查看:

<div>
  <div>
    @Html.EditorFor(model => model.Phone1)
  </div>
  <div>
    @Html.EditorFor(model => model.Phone2)
  </div>
</div>
@section Scripts {
<script>
    $(document).ready(function () {
        if ('@TempData["Phone1Type"]' != "") {
            document.getElementById("Phone1_PhoneTypeID").selectedIndex = @TempData["Phone1Type"];
        }
        if ('@TempData["Phone2Type"]' != "") {
            document.getElementById("Phone2_PhoneTypeID").selectedIndex = @TempData["Phone2Type"];
        }
    });
</script>
}

希望有所帮助!