【问题标题】:Best way to fill dropdownlist in mvc3 application在 mvc3 应用程序中填充下拉列表的最佳方法
【发布时间】:2012-09-13 00:05:52
【问题描述】:

我在 MVC3 应用程序中有一个索引视图,其 @model 是可枚举的。在这个模型中,我有一个 accountID,我想用它来用帐户填充视图过滤器中的下拉列表,以便用户能够过滤帐户。

实现这一目标的最佳方法是什么?

提前致谢。

这是视图:

@model IEnumerable<MoneyAdmin.Model.ContaAReceber>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@Html.Partial("_SubmenuAdmin")

<div class="tituloCadastro">
    Lista de Contas a Receber
</div>

<div class="buttonContainer novo">
    @Html.ActionLink("Nova Conta", "Create")
</div>

<div class="filtros">
    @using (Html.BeginForm()) { 
        <div class="filterField">
            <label>Data Inicial:</label>
            @Html.TextBox("dataInicial", @DateTime.Now.ToShortDateString())
        </div>
        <div class="filterField">
            <label>Data Final:</label>
            @Html.TextBox("dataFinal", @DateTime.Now.ToShortDateString())
        </div>
        <div class="filterField">
            <label>Tipo de Conta:</label>
            @Html.DropDownList("contaID")
        </div>

        <input type="submit" value="Atualizar" />
    }     
</div>

以及控制器方法:

public ViewResult Index(string dataInicial, string dataFinal, string contaID)
    {
        var crs = from cr in db.contasareceber.Include("contas")
                       select cr;

        if (!string.IsNullOrEmpty(dataInicial) && !string.IsNullOrEmpty(dataFinal))
        {
            DateTime di = DateTime.Parse(dataInicial);
            DateTime df = DateTime.Parse(dataFinal);

            crs = crs.Where(cr => cr.dataPagamento >= di && cr.dataPagamento <= df);
        }

        return View(crs.ToList());
    }

【问题讨论】:

  • 你能告诉我们你到目前为止做了什么/尝试了什么吗?

标签: asp.net-mvc-3


【解决方案1】:

我认为实现您所追求的最佳方式是使用 ViewModel。您将通过此加载要在视图中显示的内容。因此,您将使用您的帐户列表创建一个下拉列表,该下拉列表将加载到您的控制器中。您还将在其中拥有您的 IEnumerable ContaAReceber,它也将加载到您的控制器中。然后你的控制器会将 ViewModel 传递给 View。由于您没有向我们展示您的模型,因此很难给您一个准确的答案。但您可以以此为指导。

视图模型:

public class ContaAReceberViewModel
{
    public int ContaAReceberID {get;set;}
    public List<SelectListItem> ContaAReceberList {get;set;}
    public IEnumerable<ContaAReceber> ContaAReceber {get;set;}
}

Razor 视图中的下拉列表:

@Html.DropDownListFor(m => m.ContaAReceberID, Model.ContaAReceberList)

【讨论】:

    【解决方案2】:

    您可以使用 ViewBag 而不是创建 ViewModel 来传输数据。

    视图模型

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

    操作结果

    public ViewResult Index(string dataInicial, string dataFinal, string contaID)
    {
        var crs = from cr in db.contasareceber.Include("contas")
                  select cr;
    
        // select uniquely all available Contas
        ViewBag.UniqueContas = crs.Select(x => new ContaFilterViewModel() { Id = x.ContaId, Name = x.ContaName}).Unique().ToList();
    
        if (!string.IsNullOrEmpty(dataInicial) && !string.IsNullOrEmpty(dataFinal))
        {
            DateTime di = DateTime.Parse(dataInicial);
            DateTime df = DateTime.Parse(dataFinal);
    
            crs = crs.Where(cr => cr.dataPagamento >= di && cr.dataPagamento <= df);
        }
    
        // return filtered Contas
        return View(crs.ToList());
    }
    

    查看

    <div class="filterField">
        <label>Tipo de Conta:</label>
        @Html.DropDownList("contaID", new SelectList((ContaFilterViewModel)ViewBag.UniqueContas, "Id, "Name"))
    </div>
    

    【讨论】:

    • Alexandre,问题在于 crs 是主表,而 contas(和 contaID)只是 contasareceber 表中的导航属性。因此,由于我的模型对于 contasareceber 来说是不可枚举的,因此不幸的是,我无法投射 contas SelectList,或者至少不是那样。
    • 您需要有一个独特的 Contas 列表,您将在 DropDownList 中使用它们,然后返回过滤后的 Contas。我已经更新了我的答案来告诉你如何做。
    【解决方案3】:

    谢谢大家!

    我找到了这样的答案。

    像这样在控制器中填充视图包:

    ViewBag.Contas = new SelectList(db.contas, "contaID", "nome");
    

    然后像这样在下拉列表中使用它:

    @Html.DropDownList("Contas");
    

    简单而有效!

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 2013-02-27
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多