如何重写MVC 5路由?

时间:2016-08-18 16:07:14

标签: asp.net-mvc routing

我有两个关于在MVC 5中生成路由的问题。

这是一个例子:

routes.MapRoute(
        name: "ActionSite",
        url: "{userName}/sites/{action}/{localSiteName}",
        defaults: new { controller = "Site" }
);

@Url.RouteUrl("ActionSite", new { action="Edit", siteOrder = site.Order, localSiteName = site.LocalName, userName = ViewBag.UserName })

生成下一个网址: https://localhost:44344/TestUser/sites/Edit/Site2?siteOrder=1

1)如何隐藏变量?我想要隐藏:?siteOrder=1

2)TestUseruserName。此时我在所有[Authorize]个动作中手动设置它。我可以用一些特殊的方法做一次吗?

1 个答案:

答案 0 :(得分:1)

关于第一个问题,RouteUrl假设您将在GET方法中使用URL,并且在使用GET动词时,您必须将查询字符串附加到URL。 siteOrder必须处于查询状态,因为您没有将其放入URL模板中。任何额外的参数都会进入查询字符串。

这里的解决方案是使用POST而不是GET。下行将从客户端丢失简单的GET调用(锚点)。您必须使用@ Html.BeginForm而不是@ Html.ActionLink。

第二个问题不明确,如果您生成类似https://localhost:44344/TestUser/sites/Edit/Site2?siteOrder=1的网址,那么您将获得用户名表单网址。 例如:

public ActionResult Edit(string userName, string localSiteName){ }
这里的用户名将是" TestUser"如果userName与User.Identity.GetUserName()相同,则必须检查身份验证 或者您可以编写AuthenticationFilter来为您执行身份验证作业。

但是如果你的意思是Url.RouteUrl基于User.Identity自动填写userName属性的方式,我认为答案是否定的。您必须在ActionFilters或Action中的某处检索用户名,或者如果您使用ASP.Identity,那么您已经将用户名一直保持到View,只需要调用

@User.Identity.GetUserName()

在你的视图或控制器中获取它。