2016-08-18 46 views
0

我有两个问题关于MVC 5.如何重写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

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

这里的解决方案是使用POST而不是GET。不利的一面是会从客户端丢失简单的GET调用(锚点)。你必须使用@ Html.BeginForm而不是@ Html.ActionLink。

第二个问题还不清楚,如果您生成的URL如https://localhost:44344/TestUser/sites/Edit/Site2?siteOrder=1那么您将获得用户名表单URL。 例如:这里

public ActionResult Edit(string userName, string localSiteName){ } 

用户名会“为TestUser”,你必须检查认证,如果用户名是一样的User.Identity.GetUserName() 或者你可以写AuthenticationFilter为你做认证工作。

但是,如果你的意思是Url.RouteUrl根据User.Identity自动填写userName属性的方式,我认为答案是否定的。你必须在ActionFilters或行动某处获取的用户名,或者如果你正在使用ASP.Identity那么你已经拥有的用户名一路下跌到视图,只是你需要调用

@User.Identity.GetUserName() 
在您查看

或控制器来获取它。