1

我在 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());
    }
4

3 回答 3

3

我认为实现您所追求的最佳方法是使用 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)
于 2012-09-11T00:31:34.003 回答
1

您可以使用 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>
于 2012-09-11T00:36:51.127 回答
-1

谢谢大家!

我找到了这样的答案。

像这样在控制器中填充 viewbag:

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

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

@Html.DropDownList("Contas");

简单而且有效!

谢谢大家!

于 2012-09-11T01:15:54.943 回答