2012-09-11 58 views
1

我在MVC3應用程序中使用@model是一個可枚舉的索引視圖。在這個模型中,我有一個accountID,我想用它來在視圖過濾器中填充我的下拉列表和帳戶,以便用戶能夠過濾帳戶。在mvc3應用程序中填充下拉列表的最佳方法

這是實現此目標的最佳方法嗎?

在此先感謝。

這是視圖:

@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

你能告訴我們你到底做了什麼/試過了嗎? – jzm

回答

-1

感謝大家!

我找到了這樣的答案。

填充viewbag在這樣的控制器:

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

然後在那樣的下拉列表使用它:

@Html.DropDownList("Contas"); 

簡單,它的作品!

謝謝大家!

3

我認爲最好的方式來實現你追求的是使用一個視圖模型。您可以通過此操作加載要在視圖中顯示的內容。所以你要創建一個你的賬戶列表的下拉列表,它將被加載到你的控制器中。你還會在你的控制器中加載IEnumerable ContaAReceber。然後你的控制器將ViewModel傳遞給View。因爲你沒有向我們展示你的模型,所以很難給你一個確切的答案。但你可以用它作爲指導。

視圖模型:

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

DROPDOWNLIST在Razor視圖:

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

您可以使用,而不是創建一個視圖模型傳輸數據ViewBag。

視圖模型

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> 
+0

Alexandre,問題是crs是主表,contasarers(和contaID)只是contasareceber表中的導航屬性。所以,因爲我的模型對於contasareceber來說是永恆的,所以我不能丟棄SelectList,至少不是那樣。 – Kornel

+0

您需要有一個您將在DropDownList中使用的獨特Contas列表,然後返回過濾後的Contas。我已經更新了我的答案,告訴你如何。 –