我正在开发包含ViewModels和Controller的MVC.Net项目。为什么我不使用Model,因为我使用ADO.Net而不是Entity Framework来进行数据库连接。
为此,我在不同的项目中将ViewModels与Controller分开。这是我的问题,
我在using System.Web.MVC
中使用了SelectListItem类,但只在我的Controller项目中安装它。
这里是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填充List<SelectListItem>()
这是一个不好的做法,这导致Controller中有很多ViewBag,更不用说在View中投射ViewBag了。
为什么我想要像我这样的ViewModel
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" }
};
}
所以在Controller中我可以写
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并将System.Web.MVC
命名空间包含在我的VM项目中仅用于使用SelectListItem类,则相当浪费。
如果可能的话,如何在不添加整个命名空间的情况下添加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 :(得分:1)
如果不添加命名空间,则无法实现此行为,因为它存储了有关此类的信息。
但是,您可以创建自己的选择项目类,并创建一个扩展方法,将您的课程项目转换为import pyodbc
pyodbc.pooling = False
,如下所示:
SelectListItem
public class SimpleItem
{
public string Text { get; set; }
public string Value { get; set; }
}
应存储在SimpleItem
和ViewModel
可以访问的程序集中。
在MVC项目中创建一个扩展方法:
View
您应该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.Html
来自DropDownListFor
的{{1}}方法调用。
如果这是您的第一个helper
扩展程序,最好将此类的HtmlHelper
包含到网页web.config中。或者您需要手动将其包含在页面上:
namespace
毕竟你可以在页面上简单地调用它:
@using YourProject.RequiredNamespace