C# 每个和所有元素的下拉列表

C# 每个和所有元素的下拉列表,c#,asp.net-mvc,razor,html-select,C#,Asp.net Mvc,Razor,Html Select,有没有办法用Razor创建DropDownList,并将第二个参数作为Linq结果而不是默认的空项传递 关键是我使用的是累加器函数(“函数”),所以我不能将null传递给它(作为该问题的答案-) 如果DropDownList不合适,我真的很希望有其他选择 控制器: public ActionResult Index(string searchFullName, string searchExtension, string searchProject) {

有没有办法用Razor创建DropDownList,并将第二个参数作为Linq结果而不是默认的空项传递

关键是我使用的是累加器函数(“函数”),所以我不能将null传递给它(作为该问题的答案-)

如果DropDownList不合适,我真的很希望有其他选择

控制器:

        public ActionResult Index(string searchFullName, string searchExtension, string searchProject)
        {
            var extensionList = new List<string>();
            var projectList = new List<string>();

            var projects = from n in unitofwork.DomainRepository.Get()
                           select n.Project;
            var extensions = from n in unitofwork.DomainRepository.Get()
                             select n.Extension;

            extensionList.AddRange(extensions.Distinct());
            projectList.AddRange(projects.Distinct());

            ViewBag.searchproject = new SelectList(projectList);
            ViewBag.searchExtension = new SelectList(extensionList);

            return View(unitofwork.DomainRepository.Filter(n => n.Name.Contains(searchFullName), n => n.Extension == searchExtension));
          }
public ActionResult索引(string searchFullName、string searchExtension、string searchProject)
{
var extensionList=新列表();
var projectList=新列表();
var projects=从unitofwork.DomainRepository.Get()中的n开始
选择n.项目;
var extensions=从unitofwork.DomainRepository.Get()中的n开始
选择n.扩展;
extensionList.AddRange(extensions.Distinct());
projectList.AddRange(projects.Distinct());
ViewBag.searchproject=新建选择列表(项目列表);
ViewBag.searchExtension=新建选择列表(扩展列表);
返回视图(unitofwork.DomainRepository.Filter(n=>n.Name.Contains(searchFullName),n=>n.Extension==searchExtension));
}
“筛选”方法:

public virtual IEnumerable<T> Filter(params Expression<Func<T, bool>>[] filters)
        {
            IQueryable<T> query = dbSet;

            return filters.Aggregate(query, (a, b) => a.Where(b));
        }
@using (Html.BeginForm()) {
    <p>
        Name: @Html.TextBox("searchFullName")
        Extension: @Html.DropDownList("searchExtension", "All") <- *would like to get one extension or all extensions*
        Projects: @Html.DropDownList("searchProject","All")
        <input type="submit"    value="Filters" />
    </p> }
公共虚拟IEnumerable筛选器(参数表达式[]筛选器)
{
IQueryable query=dbSet;
返回filters.Aggregate(查询,(a,b)=>a.Where(b));
}
查看:

public virtual IEnumerable<T> Filter(params Expression<Func<T, bool>>[] filters)
        {
            IQueryable<T> query = dbSet;

            return filters.Aggregate(query, (a, b) => a.Where(b));
        }
@using (Html.BeginForm()) {
    <p>
        Name: @Html.TextBox("searchFullName")
        Extension: @Html.DropDownList("searchExtension", "All") <- *would like to get one extension or all extensions*
        Projects: @Html.DropDownList("searchProject","All")
        <input type="submit"    value="Filters" />
    </p> }
@使用(Html.BeginForm()){

名称:@Html.TextBox(“searchFullName”)

扩展名:@Html.DropDownList(“searchExtension”,“All”)筛选方法使用需要参数的委托来构造Linq查询

问题是DDL传递null作为在DDL中选择“所有”项的结果。因为Linq得到了null,所以像n=>n.Name==null这样的表达式显然不起作用

为了处理空参数,我使用了CodeMaster从链接问题中得到的提示:

return View(unitofwork.DomainRepository.Filter(n => n.Name.Contains(searchFullName), n => (String.IsNullOrEmpty(searchExtension) || n.Extension == searchExtension), n => (String.IsNullOrEmpty(searchProject) || n.Project == searchProject)));

我不确定我是否理解正确…请在两种情况下,您希望DDL中都有什么?作为DDL的一部分,我需要有一个选项,将列表中的所有项目作为“索引”的参数传递。您可以为视图创建任何类型的模型,并在视图中使用其属性。这有帮助吗?