2 Actions For Same Route in Asp.Net MVC 3



我将路由定义为

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

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

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

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

我理解了你的问题,你想实现以下行为:

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

您的主机/公司/测试

它们应该被路由到呼叫公司。

其他URL(如yourhost/Company/aother_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();
    }

您应该研究一下mvc路由约束。这将使您能够将类似url上的请求转发到不同的操作,这取决于您可以通过程序设置的不同参数
例如

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

这只会进入控制器:产品id中的产品和操作详细信息是int
在您的情况下,您必须在regex中定义模式,对于该模式,请求应该转到一个路由,并将第二个路由放在该路由旁边
因此,不符合该路由约束的每个请求将自动由下一个请求处理。

最新更新