如何摆脱ASP.NET MVC路由中的问号?

时间:2011-03-08 10:27:37

标签: asp.net-mvc model-view-controller

我定义了以下路线:

{theme}/{subtheme}/{contenttype}/{contentdetail}/Print

当我使用
时  Url.Action ("PrintLayout","Page",new {contentUrlTitle = Model.ContentUrlTitle}

我收到以下链接:

/theme1/subtheme1/contenttype1/myfirstcontenturltitle?action=PrintLayout 

我希望它是一个RESTful URL。

/theme1/subtheme1/contenttype1/myfirstcontenturltitle/Print

你知道我在这里缺少什么吗?

3 个答案:

答案 0 :(得分:3)

由于您尚未发布路线表(提示:发布您的路线表),我将不得不猜测路线是什么。如果您希望这样做,则路线必须是:

routes.MapRoute("contentDetail",
    "{theme}/{subtheme}/{contenttype}/{contentdetail}/print"
    new { controller = "Page", action = "PrintLayout", theme="", subtheme="", contenttype = ""     
    });

然后你的控制器:

public class PageController
{
    public ActionResult PrintLayout(string theme, string subtheme, string contenttype, string contentdetail)
    {
        //do print stuff here
    }
}

答案 1 :(得分:1)

Jose3d,

  1. 需要注意的一件重要事情是,'controller'和'action'参数在ASP.NET MVC中被视为特殊参数。这些参数是为url匹配提供的,即使它们未在参数值部分中明确指定。
  2. 因此,以下声明:

    Url.Action ("PrintLayout","Page",new {contentUrlTitle = Model.ContentUrlTitle}
    

    将为路线匹配提供以下参数:

    controller =“Page”,action =“PrintLayout”,contentUrlTitle =“{Model of Model.ContentUrlTitle}}”

    正如您在此处所见,ASP.NET MVC隐式定义了'controller'和'action'参数。

    1. 许多开发人员对ASP.NET MVC路由不了解的另一件事是,在路由匹配期间,过量提供的任何参数都会在URL中显示为“查询字符串”
    2. 多余的参数是未出现在网址中的参数。

      对于您的情况,'action'参数不会出现在url中,因此它将被视为'多余参数',这就是它作为查询字符串显示的原因。

      我的建议是:尝试重新格式化您的网址,以便{action}成为网址细分的一部分。

      我不明白为什么'controller'参数也不会出现在查询字符串中?也许提供更多细节可能会更有帮助。

答案 2 :(得分:0)

我想你可以试试这个:

Url.Action("PrintLayout/Print", "Page");

问题在于,当您使用Dictionary来解析新参数时,默认行为就是那个。