2011-01-26 47 views
0

讓我進一步解釋,我有很多人在我的分貝。並且他們有一對多的選擇來制定行動計劃,我的頁面會顯示所有有行動計劃的人。我也有dropdownlist過濾器扔了所有的行動計劃的人...這工作正常。 dropdownlists正常工作,我不能得到的部分是有一個dropdownlist過濾器與人名(查找所有的人的行動計劃),但下拉列表顯示所有名稱在數據庫中,而不僅僅是有行動計劃,有沒有辦法限制下拉列表只顯示有行動計劃的人?我怎樣才能將下拉列表中的選項限制爲僅有效的選項?

抱歉,如果已經有這個帖子......我一直在尋找,尋找,但無法找到解決

感謝

附:這可能幫助....沒錯我使用MVC 這在我看來是

<td><%=Html.DropDownList("FORMER_BORROWER", "All")%></td> 
     <td><%=Html.DropDownList("CURRENT_OWNERSHIP_ENTITY", "All")%></td> 
     <td><%=Html.DropDownList("RESPONSIBLE_PARTY", "All")%></td> 
     <td><%=Html.DropDownList("COMPLETED", "All")%></td> 
     <td><%=Html.DropDownList("TARGET_DATE", "All")%></td> 

這是在我的控制器

var predicate = PredicateBuilder.False<ACTION_PLAN>(); 
    predicate = predicate.Or(p => p.COMPLETED != null); 

    // former borrower 
    if ((Request.Form["FORMER_BORROWER"] != null) && Request.Form["FORMER_BORROWER"] != "") 
    { 
     FormerBorrower = Request.Form["FORMER_BORROWER"]; 
     ViewData["FORMER_BORROWER"] = new SelectList((from n in _db.Loans where (n.FORMER_BORROWER_NAME != null) select new { n.FORMER_BORROWER_NAME, FORMER_BORROWER_NAMEID = n.FORMER_BORROWER_NAME }).Distinct().ToList(), "FORMER_BORROWER_NAMEID", "FORMER_BORROWER_NAME", FormerBorrower); 
     predicate = predicate.And(p => p.Loan.FORMER_BORROWER_NAME == FormerBorrower); 
    } 
    else 
    { 
     FormerBorrower = ""; 
     ViewData["FORMER_BORROWER"] = new SelectList((from n in _db.Loans where (n.FORMER_BORROWER_NAME != null) select new { n.FORMER_BORROWER_NAME, FORMER_BORROWER_NAMEID = n.FORMER_BORROWER_NAME }).Distinct().ToList(), "FORMER_BORROWER_NAMEID", "FORMER_BORROWER_NAME"); 
    } 

    // current ownership entity 
    if ((Request.Form["CURRENT_OWNERSHIP_ENTITY"] != null) && Request.Form["CURRENT_OWNERSHIP_ENTITY"] != "") 
    { 
     CurrentOwnershipEntity = Request.Form["CURRENT_OWNERSHIP_ENTITY"]; 
     ViewData["CURRENT_OWNERSHIP_ENTITY"] = new SelectList((from n in _db.DOM_CURRENT_OWNERSHIP_ENTITies select n).ToList(), "CURRENT_OWNERSHIP_ENTITY", "CURRENT_OWNERSHIP_ENTITY", CurrentOwnershipEntity); 
     predicate = predicate.And(p => p.Loan.DOM_CURRENT_OWNERSHIP_ENTITY.CURRENT_OWNERSHIP_ENTITY == CurrentOwnershipEntity); 
    } 
    else 
    { 
     CurrentOwnershipEntity = null; 
     ViewData["CURRENT_OWNERSHIP_ENTITY"] = new SelectList((from n in _db.DOM_CURRENT_OWNERSHIP_ENTITies select n).ToList(), "CURRENT_OWNERSHIP_ENTITY", "CURRENT_OWNERSHIP_ENTITY"); 
    } 

    // responsible party 
    if ((Request.Form["RESPONSIBLE_PARTY"] != null) && Request.Form["RESPONSIBLE_PARTY"] != "") 
    { 
     ResponsibleParty = Request.Form["RESPONSIBLE_PARTY"]; 
     ViewData["RESPONSIBLE_PARTY"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "RESPONSIBLE_PARTY", "RESPONSIBLE_PARTY", ResponsibleParty); 
     predicate = predicate.And(p => p.RESPONSIBLE_PARTY == ResponsibleParty); 
    } 
    else 
    { 
     ResponsibleParty = null; 
     ViewData["RESPONSIBLE_PARTY"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "RESPONSIBLE_PARTY", "RESPONSIBLE_PARTY"); 
    } 

    // completed 
    if ((Request.Form["COMPLETED"] != null) && Request.Form["COMPLETED"] != "") 
    { 
     Completed = System.Convert.ToBoolean(Request.Form["COMPLETED"]); 
     ViewData["COMPLETED"] = new SelectList((from n in _db.ACTION_PLANs where (n.COMPLETED != null) select new { n.COMPLETED}).Distinct().ToList(), "COMPLETED", "COMPLETED", Completed); 
     predicate = predicate.And(p => p.COMPLETED == Completed); 
    } 
    else 
    { 
     Completed = System.Convert.ToBoolean(null); 
     ViewData["COMPLETED"] = new SelectList((from n in _db.ACTION_PLANs where (n.COMPLETED != null) select new { n.COMPLETED }).Distinct().ToList(), "COMPLETED", "COMPLETED"); 
    } 

    // target date 
    if ((Request.Form["TARGET_DATE"] != null) && Request.Form["TARGET_DATE"] != "") 
    { 
     TargetDate = System.Convert.ToDateTime(Request.Form["TARGET_DATE"]).ToString("MM/dd/yyyy"); 
     ViewData["TARGET_DATE"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "TARGET_DATE", "TARGET_DATE", TargetDate); 
     predicate = predicate.And(p => p.TARGET_DATE == Convert.ToDateTime(TargetDate)); 
    } 
    else 
    { 
     TargetDate = ""; 
     ViewData["TARGET_DATE"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "TARGET_DATE", "TARGET_DATE"); 
    } 
+2

那麼你是否將你的ddl綁定到所有人的列表?是否有任何理由不能過濾您綁定的數據源,以便它只包含具有行動計劃的人員?您可以在代碼層或數據訪問層執行此操作。這應該是微不足道的實現 - 也許代碼示例將有助於確定你卡在哪裏? – 2011-01-26 21:42:29

+0

大衛是正確的......如果我們知道你是如何填充你的DDL,我們將能夠更好地幫助你。爲了搭載大衛說的話,你可以使用LINQ過濾集合的結果,你可以再次調用你的數據庫並將結果綁定到你的DDL等等。這隻取決於你如何將數據提供給DDL。 – jonnyb 2011-01-26 22:18:14

回答

1

這更是一個SQL問題基本上你想你的下拉列表顯示此請求的結果:

僞代碼:

Select Person.* from Person Inner Join ActionPlan on Person.PersonnId = ActionPlan.PersonId 

的內部連接使您的查詢僅返回表格人員在ActionPlan表中具有記錄的行。

+0

是的,這是SQL示例是我想要顯示的,但我不確定在哪裏或如何我的dropdownlist後面...目前爲止我有 ​​<%= Html.DropDownList(「FORMER_BORROWER」,「全部「)%> – kyle 2011-01-26 21:48:09

0

對Html.DropDownList做一些快速的搜索似乎指向這是ASP.Net MVC - 是否正確?

如果您使用的是MVC,我很驚訝您所做的只是在屏幕上顯示數據庫數據,而不知道您可以在哪裏過濾該數據。也許你自動生成了一切?

我沒有使用MVC,但只是在Visual Studio中放了一個快速和髒的例子。你應該看到兩個文件夾,一個叫Views,一個叫Controllers。

在Views文件夾中應該是一個視圖文件,它是您提供的標記所在的位置。

在Controllers文件夾應該有您的視圖控制器文件,這將是與內容看起來像這樣一類:

namespace MvcApplication1.Controllers 
{ 
    [HandleError] 
    public class YourController : Controller 
    { 
     public ActionResult YourView() 
     { 
      ViewData["FORMER_BORROWER"] = new SelectList(db.Borrowers.ToList, "BorrowerID, "Name");    

      return View(); 
     } 
    } 
} 

的代碼結合DropDownList控件的位線: ViewData [「FORMER_BORROWER」] = ...

現在在那個SelectList中,第一個參數只是一個IEnumerable(在我的情況下訪問數據庫),因此您可以使用LINQ來過濾該對象。

下面是一個簡單的例子,我提供的IEnumerable是在代碼中創建的,但是訪問您數據庫的代碼可以以類似的方式使用。不是我如何使用聯接來給出所需的值。

List<SelectListItem> items = new List<SelectListItem>(); 
      items.Add(new SelectListItem { Text = "Swimming", Value = "1" }); 
      items.Add(new SelectListItem { Text = "Cycling", Value = "2", Selected = true }); 
      items.Add(new SelectListItem { Text = "Running", Value = "3" });   

List<ExerciseType> et = new List<ExerciseType>(); 
    et.Add(new ExerciseType{Id="1"}); 
    et.Add(new ExerciseType{Id="2"}); 

// the line below uses LINQ to filter out the item with text of "Swimming"    
var filteredList = from x in items 
        join y in et on x.Value equals y.Id 
        where x.Text != "Swimming" 
        select x; 


ViewData["Testing"] = new SelectList(filteredList, "Value", "Text"); 

上面的代碼現在只會在DDL中顯示一個項目 - 由於連接和位置的循環項目。

以你的控制器代碼,你最終會得到類似下面的代碼(僅着眼於一半FORMER_BORROWER的的if/else分支)上面的答案

FormerBorrower = Request.Form["FORMER_BORROWER"];    
ViewData["FORMER_BORROWER"] = new SelectList((
    from n in _db.Loans 
    join x in _db.ActionPlans on n.BorrowerId equals x.BorrowerId 
    where (n.FORMER_BORROWER_NAME != null) 
    select new { n.FORMER_BORROWER_NAME, FORMER_BORROWER_NAMEID = n.FORMER_BORROWER_NAME }).Distinct().ToList(), 
    "FORMER_BORROWER_NAMEID", 
    "FORMER_BORROWER_NAME", FormerBorrower); 

    predicate = predicate.And(p => p.Loan.FORMER_BORROWER_NAME == FormerBorrower);  

一種意見是,雖然這將工作,我會親自看看調整設計,爲控制器調用某種服務,抽象出一些這種數據訪問邏輯。理想情況下,您現在應該在控制器層中使用ObjectContext,但在服務層中使用ObjectContext,從而使得更多的控制器不會在訪問數據層的同時控制視圖。

相關問題