在C#中添加不包含System.Web.MVC的SelectListItem()类

时间:2017-03-07 04:41:51

标签: c# asp.net-mvc razor

我正在开发包含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);
}

1 个答案:

答案 0 :(得分:1)

如果不添加命名空间,则无法实现此行为,因为它存储了有关此类的信息。

但是,您可以创建自己的选择项目类,并创建一个扩展方法,将您的课程项目转换为import pyodbc pyodbc.pooling = False ,如下所示:

SelectListItem

public class SimpleItem { public string Text { get; set; } public string Value { get; set; } } 应存储在SimpleItemViewModel可以访问的程序集中。

在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