C# 如何在MVC中重载控制器

C# 如何在MVC中重载控制器,c#,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc Routing,我正在尝试重载MVC控制器,如何正确地重载它 我想在ListCompanys()控制器中列出我网站中的所有公司,如下所示 http://localhost:21047/Home/ListCompanies http://localhost:21047/Home/ListCompanies/sera 如果用户进行如下搜索,我想添加搜索条件 http://localhost:21047/Home/ListCompanies http://localhost:21047/Home/ListCom

我正在尝试重载MVC控制器,如何正确地重载它

我想在ListCompanys()控制器中列出我网站中的所有公司,如下所示

http://localhost:21047/Home/ListCompanies
http://localhost:21047/Home/ListCompanies/sera
如果用户进行如下搜索,我想添加搜索条件

http://localhost:21047/Home/ListCompanies
http://localhost:21047/Home/ListCompanies/sera
“血清”是我的搜索条件。如果存在搜索条件,我希望根据搜索条件筛选搜索结果

这是我的控制器

public ActionResult ListCompanies()
{
   return View(db.AY_COMPANIES);
}

[ActionName("ListCompaniesFilter")]
public ActionResult ListCompanies(string filter)
{
    var filtredCompanies = from c in db.AY_COMPANIES
                  where c.COMPANY_FULL_NAME.StartsWith(filter)
                               select c;
    return View(filtredCompanies);
}
这是我的路由,它的行为不正确

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Home", // Route name
            "{controller}/{action}/{filter}", // URL with parameters
            new { controller = "Home", action = "ListCompanies", filter = UrlParameter.Optional} // Parameter defaults
        );
    }

我的MapRoutes不正确,因为它没有正确获取搜索条件。如何解决此问题?

如果只有一个操作带有可选参数,会发生什么情况?如下所示:

public ActionResult ListCompanies(string filter = null)
{
    var filteredCompanies = string.IsNullOrEmpty(filter)
         ? db.AY_COMPANIES
         : from c in db.AY_COMPANIES
           where c.COMPANY_FULL_NAME.StartsWith(filter)
           select c;
    return View(filteredCompanies);
}

如果只有一个带有可选参数的操作,会发生什么情况?如下所示:

public ActionResult ListCompanies(string filter = null)
{
    var filteredCompanies = string.IsNullOrEmpty(filter)
         ? db.AY_COMPANIES
         : from c in db.AY_COMPANIES
           where c.COMPANY_FULL_NAME.StartsWith(filter)
           select c;
    return View(filteredCompanies);
}

首先,这些路线完全相同:

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index",
              id = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "Home", // Route name
        "{controller}/{action}/{filter}", // URL with parameters
        new { controller = "Home", action = "ListCompanies", 
              filter = UrlParameter.Optional} // Parameter defaults
    );
它们完全相同,因为参数的数量完全匹配(您命名的参数或参数类型都不会更改http请求方法的签名)

有几种不同的方法来实现这一点。如果控制器/action/id符合一组特定的条件,您可以为默认值编写一个命令,以阻止它工作。可能不是最好的行动方案

以编程方式处理相同的请求,并且
{id}
的方法
ListCompanies()
的值为空

public ActionResult ListCompanies(string id)
{
  var query = db.AY_COMPANIES;

  if (!string.IsNullOrWhiteSpace(id))
  {
    query.Where(c => c.COMPANY_FULL_NAME.StartsWith(id))
  }

  var model = query.ToList();

  return View(model);
}

然后删除“主”地图路线,就不需要了。

首先,这些路线完全相同:

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index",
              id = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "Home", // Route name
        "{controller}/{action}/{filter}", // URL with parameters
        new { controller = "Home", action = "ListCompanies", 
              filter = UrlParameter.Optional} // Parameter defaults
    );
它们完全相同,因为参数的数量完全匹配(您命名的参数或参数类型都不会更改http请求方法的签名)

有几种不同的方法来实现这一点。如果控制器/action/id符合一组特定的条件,您可以为默认值编写一个命令,以阻止它工作。可能不是最好的行动方案

以编程方式处理相同的请求,并且
{id}
的方法
ListCompanies()
的值为空

public ActionResult ListCompanies(string id)
{
  var query = db.AY_COMPANIES;

  if (!string.IsNullOrWhiteSpace(id))
  {
    query.Where(c => c.COMPANY_FULL_NAME.StartsWith(id))
  }

  var model = query.ToList();

  return View(model);
}

并删除您的“主”地图路线,它将不再需要。

您不能以这种方式过载,因为有调度问题,因为两条路线具有相同的三个部分,它们本质上是相同的

"{controller}/{action}/{id}"

一种方法是将两种操作方法合并为一种

public ActionResult ListCompanies(string filter)
然后,如果filter为null,则返回完整列表,否则返回过滤后的列表。 我不喜欢这种方法

解决此问题的一个更好但简单的方法是:

1) 移除第二条路线(带过滤器的路线)

2) 将操作方法的签名从

public ActionResult ListCompanies(string filter)

允许第一条路由与名称上的参数匹配

3) 由于无法重载方法,因此在请求筛选结果时需要使用ActionName

 http://localhost:21047/Home/ListCompaniesFilter/sera

您不能以这种方式过载,因为有调度问题,因为两条路由具有相同的三个部分,它们本质上是相同的

"{controller}/{action}/{id}"

一种方法是将两种操作方法合并为一种

public ActionResult ListCompanies(string filter)
然后,如果filter为null,则返回完整列表,否则返回过滤后的列表。 我不喜欢这种方法

解决此问题的一个更好但简单的方法是:

1) 移除第二条路线(带过滤器的路线)

2) 将操作方法的签名从

public ActionResult ListCompanies(string filter)

允许第一条路由与名称上的参数匹配

3) 由于无法重载方法,因此在请求筛选结果时需要使用ActionName

 http://localhost:21047/Home/ListCompaniesFilter/sera

除非使用正确的MapRoute,
过滤器
的可能副本的可能副本将始终为空。
过滤器
将始终为空,除非使用正确的MapRoute。