1

Inumerable である @model を持つ MVC3 アプリケーションに Index ビューがあります。このモデルには、ユーザーがアカウントをフィルタリングできるように、ビュー フィルターのドロップダウン リストにアカウントを入力するために使用する 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 View のドロップダウンリスト:

@Html.DropDownListFor(m => m.ContaAReceberID, Model.ContaAReceberList)
于 2012-09-11T00:31:34.003 に答える
1

ViewModel を作成する代わりに ViewBag を使用してデータを転送できます。

ビューモデル

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.Contas = new SelectList(db.contas, "contaID", "nome");

次に、次のようにドロップダウンリストで使用します。

@Html.DropDownList("Contas");

シンプルで機能します!

みんなありがとう!

于 2012-09-11T01:15:54.943 に答える