我有两个关于在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)TestUser
是userName
。此时我在所有[Authorize]
个动作中手动设置它。我可以用一些特殊的方法做一次吗?
答案 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()
在你的视图或控制器中获取它。