MVC5路线不起作用

时间:2014-07-10 17:07:12

标签: c# asp.net-mvc

我最近从MVC 5升级到了MVC 3.我从未注册过一条路线,但是,这个URL有效:

http://www.testsite.com/shipworks/index/myemail@yahoo.com?website=testsite.com

这是我的代码:

    [HttpPost]
    public ActionResult Index(string id, string website)
    {
        string data = string.Empty;
    }

我现在使用此代码获得404。我试过这条路线,但也失败了:

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

        routes.MapRoute(
"ShipWorks", // Route name
"{controller}/{action}/{id}/{website}", // URL with parameters
new { controller = "ShipWorks", action = "Index", email = UrlParameter.Optional, website =     
UrlParameter.Optional }, new[] { "CloudCartConnector.Web.Controllers" }// Parameter defaults
);

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
}

我做错了什么?我将运输路线置于默认路线之上。请注意,我的id是一个字符串。该URL可以正常使用?id = myemail@myemail.com。

1 个答案:

答案 0 :(得分:1)

第一种方法。
根据你的路径:

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

您不需要明确指定"网站"财产名称。然后,您在路线中标记{id}{website}以斜线/分隔,因此正确使用路线掩码应为http://www.testsite.com/shipworks/index/myemail@yahoo.com/testsite.com
但是,这里有一个问题 - 无法正确识别点符号.(以您希望的方式)。因此,如果删除点,则路径http://www.testsite.com/shipworks/index/myemail@yahoo.com/testsitecom将起作用。

第二种方法。
为了达到您想要的结果,您最好将电子邮件和网站作为查询参数传递,而不是作为路径的一部分。
您可以使用以下路由配置:

routes.MapRoute(
    "ShipWorks", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new
    {
        controller = "ShipWorks",
        action = "Index",
        id = UrlParameter.Optional
    }, new[] { "CloudCartConnector.Web.Controllers" }// Parameter defaults
);

控制器的行动:

//[HttpPost]
public ActionResult Index(string email, string website)
{
    (...)
    return View();
}

查询字符串:http://www.testsite.com/shipworks/index?email=myemail@yahoo.com&website=testsite.com

另请注意,由于您使用Index属性标记了[HttpPost]方法,即使您使用404方法(例如在浏览器中输入),您也会获得GET有正确的网址。