2015-05-20 69 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