我在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());
}
答案 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");
简单而且有效!
谢谢大家!