1

我有一些代码在表格中的剃刀文件中使用以下方法设置下拉列表:

    foreach (var item in group) {
                <tr>
                    <td>
    ...
        @Html.DropDownListFor(modelItem => item.OfficeUserId, Model.OfficeApprovers, new { @class = "officeapproverddl", invoiceLineId = @item.InvoiceLineId, officeUserId = @item.OfficeUserId })
    ...
    </td>
    </tr>
}
    </table>

这很好用,但是现在我想要表外的相同下拉列表。因此将没有要使用的项目对象。

你如何在桌子之外进行这项工作,即。我现在必须提供的只是 Model.OfficeApprovers 和 html 属性。

Model.OfficeApprovers 的类型为:new Dictionary<string, IEnumerable<SelectListItem>>();

4

2 回答 2

2

您使用字典有什么原因吗?

下面是我在填充下拉列表时通常如何做的代码。它非常简单,我建议您将其用作构建下拉列表的基础。

在我的视图顶部,我指定了我的视图模型:

@model MyProject.ViewModels.MyViewModel

在我看来,我有一个下拉列表,其中显示了用户可以选择的所有银行:

<table>
     <tr>
          <td><b>Bank:</b></td>
          <td>
               @Html.DropDownListFor(
                    x => x.BankId,
                    new SelectList(Model.Banks, "Id", "Name", Model.BankId),
                    "-- Select --"
               )
               @Html.ValidationMessageFor(x => x.BankId)
          </td>
     </tr>
</table>

我总是有一个视图的视图模型,我从不将域对象直接传递给视图。在这种情况下,我的视图模型将包含将从数据库中填充的银行列表:

public class MyViewModel
{
     // Other properties

     public int BankId { get; set; }
     public IEnumerable<Bank> Banks { get; set; }
}

我的银行域模型:

public class Bank
{
     public int Id { get; set; }
     public string Name { get; set; }
}

然后在我的操作方法中创建我的视图模型的一个实例并从数据库中填充银行列表。完成后,我将视图模型返回到视图:

public ActionResult MyActionMethod()
{
     MyViewModel viewModel = new ViewModel
     {
          // Database call to get all the banks
          // GetAll returns a list of Bank objects
          Banks = bankService.GetAll()
     };

     return View(viewModel);
}

我希望这有帮助。

于 2012-04-11T08:54:09.810 回答
1

从这里http://msdn.microsoft.com/en-us/library/ee703573.aspx我们有DropDownListFor这个语法:

public static MvcHtmlString DropDownListFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression,
    IEnumerable<SelectListItem> selectList,
    Object htmlAttributes
)

构造 a 时必须提供表达式DropDownListFor

expression: System.Linq.Expressions.Expression(Of Func(Of TModel, TProperty))
An expression that identifies the object that contains the properties to render.

因此,您想要的方式不适用于 DropDownListFor。

在这种情况下,您最好的选择是使用简单的@Html.DropDownList. 您可以使用此重载来实现您想要的:

public static MvcHtmlString DropDownList(
    this HtmlHelper htmlHelper,
    string name,
    IEnumerable<SelectListItem> selectList,
    IDictionary<string, Object> htmlAttributes
)

样本:

@Html.DropDownList("officeApprovers", Model.OfficeApprovers,
                                                   new { @class = "officeapproverddl" }

编辑:

试试这个:

@Html.DropDownList("officeApprovers", Model.OfficeApprovers.Values[0],
                                                   new { @class = "officeapproverddl" }
于 2012-04-11T01:41:50.380 回答