2017-03-07 55 views
-2

我正在研究包含ViewModel和Controller的MVC.Net項目。爲什麼我不使用Model,因爲我使用ADO.Net而不是實體框架來連接數據庫。在C#中不包含System.Web.MVC的情況下添加SelectListItem()類

爲此,我在不同的項目中將ViewModels與控制器分開。這裏是我的問題, 我利用using System.Web.MVC中的SelectListItem類,但只安裝在我的Controller項目中。控制器代碼片段的

這裏例如:

public ActionResult Index() 
    { 
     ViewBag.ddlistname = new List<SelectListItem> { 
      new SelectListItem { Text = "Anthony", Value = "1" }, 
      new SelectListItem { Text = "Miranda", Value = "2" }, 
      new SelectListItem { Text = "Jhon", Value = "3" } 
     }; 
     ViewBag.ddlistpos = new List<SelectListItem> { 
      new SelectListItem { Text = "Store Clerk", Value = "A" }, 
      new SelectListItem { Text = "Waiter", Value = "B" }, 
      new SelectListItem { Text = "Cook", Value = "C" } 
     }; 
     var result = new CRViewModel(); 
     return View(result); 
    } 

查看:

@Html.DropDownListFor(model => model.EmpName,(IEnumerable<SelectListItem>)ViewBag.ddlistname) 
@Html.DropDownListFor(model => model.EmpPost,(IEnumerable<SelectListItem>)ViewBag.ddlistpos) 

我知道這是一個不好的做法使用ViewBag這就造成了內部控制很多ViewBag填補List<SelectListItem>(),不在View中提到鑄造ViewBag。

這就是我希望我的ViewModels這樣

public class CRViewModels 
{ 
    public string EmpName { get; set; } 
    public string EmpPos { get; set; } 
    public List<SelectListItem> EmpList = new List<SelectListItem> 
     { 
      new SelectListItem { Text = "Anthony", Value = "1" }, 
      new SelectListItem { Text = "Miranda", Value = "2" }, 
      new SelectListItem { Text = "Jhon", Value = "3" } 
     }; 
    public List<SelectListItem> PosList = new List<SelectListItem> 
     { 
      new SelectListItem { Text = "Store Clerk", Value = "A" }, 
      new SelectListItem { Text = "Waiter", Value = "B" }, 
      new SelectListItem { Text = "Cook", Value = "C" } 

     }; 
} 

所以在控制器我可以寫

public ActionResult Index() 
    { 
     var result = new CRViewModel(); 
     return View(result); 
    } 

,並考慮:

@Html.DropDownListFor(model => model.EmpName,Model.EmpList) 
@Html.DropDownListFor(model => model.EmpPost,Model.PosList) 

,但我不能,因爲在我的ViewModels(VM)項目,我沒有命名空間System.Web.MVC。如果我添加dll,並且僅在使用SelectListItem類時將System.Web.MVC名稱空間添加到我的VM項目,那就太浪費了。

如果可能的話,如何添加SelectListItem類而不添加整個名稱空間?

編輯: 爲您的要求,我添加了我的真實代碼示例 這是我的代碼如何工作。

在DAL類:

public List<SelectListItem> getcustlist() 
     { 
      string SQL = "select cust_name, cust_id from tbl_cust"; 
      List <SelectListItem> result = getdropdownfromSQL(SQL, "cust_name", "cust_id "); 
      return result; 
     } 
public List<SelectListItem> getpostype() 
     { 
      string SQL = "select pos_name, pos_code from tbl_pos"; 
      List<SelectListItem> result = getdropdownfromSQL(SQL, "pos_name", "pos_code"); 
      return result; 
     } 

public List<SelectListItem> getdropdownfromSQL(string SQL, string Text, string Value) 
     { 
      string Conn = GetConn();//function to get connection string 
      List<SelectListItem> result = new List<SelectListItem>(); 
      string errmsg; 
      DataTable fetch = getdt(SQL, Conn, out errmsg); 
      if (fetch == null) 
       return result; 
      int rowaffect = fetch.Rows.Count; 
      for (int i = 0; i < rowaffect; i++) 
      { 
       result.Add(new SelectListItem 
       { 
        Text = fetch.Rows[i][Text].ToString(), 
        Value = fetch.Rows[i][Value].ToString() 
       }); 
      } 
      return result; 
     } 

public DataTable getdt(string SQL, string strconn, out string errormsg) 
     { 
      errormsg = ""; 
      DataTable dt = new DataTable(); 
      try 
      { 
       using (SqlConnection conn = new SqlConnection(strconn)) 
       { 
        using (SqlDataAdapter da = new SqlDataAdapter(SQL, conn)) 
        { 
         conn.Open(); 
         da.Fill(dt); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       errormsg = ex.Message; 
       return null; 
      } 
      return dt; 
     } 

在控制器:

private DAL func = new DAL(); 
public ActionResult Index() 
{ 
    ViewBag.ddlistname = func.getcustlist(); 
    ViewBag.ddlistpos = func.getpostype(); 
    var result = new CRViewModel(); 
    return View(result); 
} 
+0

您需要添加的命名空間。這樣做是有道理的。它是一個視圖模型,特定於'System.Web.MVC'中的視圖。而且命名空間正在您的應用程序中使用,所以它沒有任何區別(不清楚爲什麼您認爲浪費_) –

+0

因爲我使用Visual Studio中的Nuget包來在需要Internet訪問的項目中添加dll。在我的工作場所,上網受到限制。我只能在這裏訪問Intranet。雖然可以請求臨時訪問,但這裏有點複雜,所以需要做很多工作。 – KokoriNut

+2

您使用MVC所以''.dll'已經安裝在您的計算機上 - 您不需要使用Nuget –

回答

1

你不能沒有加入的命名空間,因爲它存儲有關此類的信息實現這種行爲。

但是,您可以創建自己的選擇項類,並創建一個擴展方法轉換類的項目SelectListItem如下:

public class SimpleItem 
{ 
    public string Text { get; set; } 
    public string Value { get; set; } 
} 

SimpleItem應存放在裝配到ViewModel S和View小號有訪問權。

而在MVC項目中創建一個擴展方法:

public static class HtmlExtensions 
{ 
    public static MvcHtmlString LocalDropDownListFor<TModel, TProperty>(
     this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expr, 
     IEnumerable<SimpleItem> items) 
    { 
     return helper.DropDownListFor(expr, 
      items.Select(x => new SelectListItem { Text = x.Text, Value = x.Value })); 
    } 
} 

您應該包括System.Web.Mvc.Htmlhelper使DropDownListFor方法調用。

如果這是您的第一個HtmlHelper擴展名,最好將此類的namespace包含到頁面web.config中。或者,你將需要手動包括它頁:

@using YourProject.RequiredNamespace 

畢竟,你可以簡單的把它叫做頁:

@Html.LocalDropDownListFor(model => model.EmpName, Model.EmpList) 
+0

謝謝,我曾嘗試製作自己的selectlistitem方法,但無法正常工作。我有自己的助手擴展。將嘗試它並標記爲正確,如果它工作。祝我好運夥計 – KokoriNut

+0

只需一張紙條。我不接受這種行爲。海事組織這是一種糟糕的代碼來存儲下拉值ViewModel,並可能有其他解決方案,你可以從評論中看到。 –

+0

這不是一個問題BC我用dB存儲它並有函數來調用它。例子只是爲了方便 – KokoriNut

相關問題