【问题标题】:2 Actions For Same Route in Asp.Net MVC 3Asp.Net MVC 3 中相同路由的 2 个操作
【发布时间】:2012-07-11 06:36:33
【问题描述】:

我将路线定义为

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

现在的问题是,如果我现在向公司控制器发出任何请求并将参数传递给 CompanyDetail 方法,我已经创建了这条路线,但在一种情况下,我不想发送到我想发送的这个方法控制另一个动作CallCompany。如何解决这个问题并注意我还需要运行这两种类型的请求。

【问题讨论】:

  • 您能否提供应该转到 CallCompany 操作的 url
  • /Company/Foo ... 这里 Foo 是参数,我希望它转到 /Company/CallCompany 但由于默认 Route 它转到 /Company/CompanyDetail
  • 你能告诉我们你所有的路线吗?另外,您不想发送到此方法的“一个条件”是什么?

标签: asp.net-mvc asp.net-mvc-3 routing asp.net-mvc-routing


【解决方案1】:

你可以在你的控制器方法中设置它:

public ActionResult CompanyDetail(string companyname)
{
    if (condition)
    {
        return RedirectToAction("ActionName", new { companyname = companyname});
    }
    return View();
}

【讨论】:

    【解决方案2】:

    据我了解您的问题,您希望实现以下行为:

    有一组公司名称(例如,“test”),它们与 URL 对应

    您的主机/公司/测试

    它们应该被路由到 CallCompany。

    应将其他 URL(例如 yourhost/Company/another_company)路由到 CompanyDetail。

    我认为,最好的方法是在 CompanyDetail 方法中进行重定向

        public ActionResult CallCompany(string companyname)
        {
            return View();
        }
        public ActionResult CompanyDetail(string companyname)
        {
            IEnumerable<string> myCompanies = GetSpecialCompany();
            if (myCompanies.Contains(companyname))
            {
                return RedirectToAction("CallCompany", new { companyname = companyname });
            }
            return View();
        }
    
        private IEnumerable<string> GetSpecialCompany()
        {
            throw new NotImplementedException();
        }
    

    【讨论】:

      【解决方案3】:

      您可能应该查看 mvc route constraints。这将使您能够将类似 url 上的请求转发到不同的操作,具体取决于您可以以编程方式设置的 uopn 不同参数。
      例如

      routes.MapRoute(
          "Product",
          "Product/{productId}",
          new {controller="Product", action="Details"},
          new {productId = @"\d+" }
       );
      

      这只会转到控制器:产品 ID 中的产品和操作详细信息是一个 int
      在您的情况下,您将必须在正则表达式中定义模式,该模式的请求应该转到一个路由并将第二个路由放置在此
      因此,每个符合此路由约束的请求都会自动由下一个请求处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-29
        • 1970-01-01
        • 2016-12-09
        • 2011-08-11
        • 2016-06-19
        相关资源
        最近更新 更多