2015-05-20 70 views
1

我想要實現這已經寫在我的colleague.I的asp.net應用程序功能的作用訪問下拉列表控件ID要實現在asp.net的MVC 但我不相同的邏輯「知道如何讓一個下拉列表控件的ID在控制器 的作用是什麼,他所做的是他是人口dropdwonlist通過調用下面如何控制

Global.BindRigionByApplicationAccess(drpRegion, 
            ConfigurationManager.AppSettings["ApplicationId"], 
            ref ErrorMessage); 

這裏顯示的功能‘drpRegion’是下拉列表的ID,在asp.net中,只是該函數的一個簡單調用會加載數據。

我沒有按照asp.net的MVC

碼鑑於

@Html.DropDownList("REGION_CODE", (SelectList)ViewBag.gpregions) 
+0

不清楚你的要求。你想,當你回來後,還是要預先選擇當你第一次渲染視圖選項來獲得下拉的選擇的價值? –

+1

我不認爲你可以在asp.net mvc中使用'Global.BindRigionByApplicationAccess'方法。控制器不應該知道關於html控件的任何信息。你可以添加'Global.BindRigionByApplicationAccess'方法的代碼嗎?如果我們知道該方法做了什麼,也許我們可以重新創建一個在MVC中工作的類似方法。 – ekad

+0

@ekad我解答了我的問題 – peter

回答

1

您可以在下拉菜單控制不能傳遞到LoadDropDown方法,因爲控制器不知道HTML控件什麼。你需要做的是以下幾點:

  1. 從數據庫中獲取數據。
  2. 基於數據的List<SelectListItem>一個實例。
  3. 傳遞的List<SelectListItem>實例的視圖
  4. 使用的List<SelectListItem>實例如在視圖@Html.DropDownList輔助方法的第二個參數。

讓我們從DataAccessLib類開始。我將創建下列方法返回一個Dictionary<string, string>

public Dictionary<string, string> GetDropdownItems(string sQuery, string sDTextField, string sDValueField) 
{ 
    Dictionary<string, string> dict = new Dictionary<string, string>(); 

    using (OracleConnection odConn = new OracleConnection(sConnStr)) 
    { 
     odConn.Open(); 
     OracleCommand odCmd = odConn.CreateCommand(); 
     odCmd.CommandText = sQuery; 
     using (var dr = odCmd.ExecuteReader()) 
     { 
      while (dr.Read()) 
      { 
       dict[dr[sDValueField].ToString()] = dr[sDTextField].ToString(); 
      } 
     } 
    } 
    return dict; 
} 

然後Global類中創建下面的方法。基本上,它集查詢,調用上面的方法,並生成List<SelectListItem>

public static List<SelectListItem> GetRegionDropdownItems(string ApplicationId, ref string ErrorMessage) 
{ 
    string query = @"SELECT distinct GP_REGION.REGION_MAIN Region_Code, 
    R1.REGION_NAME FROM GP_REGION INNER JOIN GP_REGION R1 
    ON GP_REGION.REGION_MAIN = R1.REGION_CODE WHERE GP_REGION.REGION_HAS_DATA='Y' 
    AND GP_REGION.REGION_MAIN IN (SELECT DISTINCT AR.BRANCH_CODE FROM PORTAL.UA_APPLN_ROLE AR 
    INNER JOIN PORTAL.UA_GROUP G ON AR.GROUP_CODE = G.GROUP_CODE 
    WHERE G.USER_ID = '" + Global.UserId() + "' AND AR.APPLICATION_ID = '" + ApplicationId + "') ORDER BY GP_REGION.REGION_MAIN"; 

    // get the regions from database 
    DataAccessLib dal = new DataAccessLib(Global.ConnectionString()); 
    Dictionary<string, string> regions = dal.GetDropdownItems(query, "REGION_NAME", "Region_Code"); 

    // generate the dropdown items 
    List<SelectListItem> ddlItems = new List<SelectListItem>(); 
    foreach (var key in regions.Keys) 
    { 
     ddlItems.Add(new SelectListItem() { Selected = false, Text = regions[key], Value = key }); 
    } 

    return ddlItems; 
} 

一個實例然後調用Global.GetRegionDropdownItems並設置結果ViewBag.Regions在控制器

public ActionResult _GetRegions() 
{ 
    List<SelectListItem> ddlItems = Global.GetRegionDropdownItems(
             ConfigurationManager.AppSettings["ApplicationId"], 
             ref ErrorMessage); 
    ViewBag.Regions = ddlItems; 

    return PartialView(); 
} 

最後使用@Html.DropDownList helper方法在你看來如下

@Html.DropDownList("REGION_CODE", (List<SelectListItem>)ViewBag.Regions) 
+0

你是輝煌的,你操縱了我的項目,你的猜測是正確的。我想問你在這裏的一個問題Global.UserId()將返回Httpcontext.current.session [「userid」],這將在asp中工作。網絡mvc? – peter

+1

我想它會工作,你有沒有嘗試在'GetRegionDropdownItems'方法內部調試,看看'Global.UserId()'是否返回正確的值? – ekad

2

你不能一個控制器的動作中訪問一個下拉列表。請詳細瞭解MVC模式:http://www.microsoftvirtualacademy.com/training-courses/introduction-to-asp-net-mvc http://www.asp.net/mvc/overview/getting-started/introduction/getting-started

您需要創建要綁定,並通過它返回的數據傳遞到視圖中的數據的列表:

return View(myDataViewModel); 

之後,你是能夠用這些數據創建一個下拉列表。

參見:http://www.asp.net/mvc/overview/views/dynamic-v-strongly-typed-views