C# 在C中添加SelectListItem()类而不包括System.Web.MVC
我正在从事包含ViewModels和Controller的MVC.Net项目。为什么我不使用模型,因为我使用ADO.Net而不是实体框架来连接数据库 为此,我在不同的项目中使用控制器分离ViewModels。这是我的问题, 我在使用System.Web.MVC时使用SelectListItem类,但只在我的控制器项目中安装它 以下是控制器代码段的示例:C# 在C中添加SelectListItem()类而不包括System.Web.MVC,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我正在从事包含ViewModels和Controller的MVC.Net项目。为什么我不使用模型,因为我使用ADO.Net而不是实体框架来连接数据库 为此,我在不同的项目中使用控制器分离ViewModels。这是我的问题, 我在使用System.Web.MVC时使用SelectListItem类,但只在我的控制器项目中安装它 以下是控制器代码段的示例: public ActionResult Index() { ViewBag.ddlistname = new L
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,Model.EmpList )
@Html.DropDownListFor(model => model.EmpPost,Model.PosList )
但我不能,因为在我的ViewModelsVM项目中,我没有名称空间System.Web.MVC。如果我只为使用SelectListItem类而在VM项目中添加dll并包含System.Web.MVC命名空间,那将是一种浪费
如果可能,如何添加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;
}
如果不添加名称空间,就无法实现此行为,因为它存储了有关此类的信息 但是,您可以创建自己的select item类,并创建一个扩展方法,将类中的项转换为SelectListItem,如下所示:
public class SimpleItem
{
public string Text { get; set; }
public string Value { get; set; }
}
SimpleItem应存储在ViewModels和Views可以访问的部件中
在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 } ));
}
}
毕竟,您可以在第页简单地调用它:
@Html.LocalDropDownListFor(model => model.EmpName, Model.EmpList)
您需要添加名称空间。这样做是有道理的。它是一个视图模型,特定于System.Web.MVC中的视图。不管怎么说,名称空间正在你的应用程序中使用,所以这没有什么区别。不清楚为什么你认为这是一种浪费,因为我使用Visual Studio的Nuget包在我的项目中添加了需要访问Internet的dll。在我的工作场所,上网受到限制。我只能在这里访问内部网。虽然可以请求临时访问,但这里有点复杂,所以有很多工作要做。您使用的是MVC,因此.dll已经安装在您的计算机上-您不需要使用NugetI使用5.0 MVC,计算机最多只有4.0。假设我使用System.Web.MVC,它会出现任何错误吗?谢谢,我尝试了自己的selectlistitem方法,但没有成功。我有自己的助手扩展。将尝试它,并标记为正确,如果它工作。祝我好运,伙计,留个条子吧。我不接受这种行为。在我看来,在ViewModel中存储下拉列表值是一种很糟糕的代码,可能还有其他解决方案,正如您从注释中看到的。这不是问题,因为我将其存储在dB中,并具有调用它的函数。以身作则只是为了方便
private DAL func = new DAL();
public ActionResult Index()
{
ViewBag.ddlistname = func.getcustlist();
ViewBag.ddlistpos = func.getpostype();
var result = new CRViewModel();
return View(result);
}
public class SimpleItem
{
public string Text { get; set; }
public string Value { get; set; }
}
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 } ));
}
}
@using YourProject.RequiredNamespace
@Html.LocalDropDownListFor(model => model.EmpName, Model.EmpList)