在mvc3应用程序中填写下拉列表的最佳方法

时间:2012-09-11 00:01:46

标签: asp.net-mvc-3

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

实现这一目标的最佳途径是什么?

提前致谢。

这是观点:

@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());
    }

3 个答案:

答案 0 :(得分:3)

我认为实现目标的最佳方式是使用ViewModel。您可以通过此方式加载要在View中显示的内容。因此,您需要使用您的帐户列表创建一个下拉列表,该列表将加载到您的控制器中。您还将在其中安装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)

答案 1 :(得分:1)

您可以使用ViewBag代替创建ViewModel来传输数据。

<强>视图模型

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

<强>的ActionResult

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>

答案 2 :(得分:-1)

谢谢大家!

我找到了这样的答案。

在控制器中填充视图包:

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

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

@Html.DropDownList("Contas");

简单而且有效!

谢谢大家!