我有这样的行动:
public ActionResult UserDetails(string id)
{
}
context.MapRoute(
"Admin_Default",
"{controller}/{action}/{id}",
new { action = "Index", controller = "Start", id = UrlParameter.Optional }
);
在另一个视图中,我有一个列表,其中包含来自.net中标准成员资格管理的用户 想法是你点击一个用户名来显示细节,这只有当用户名在一个单词中时才有用。我最近遇到了一个如下所示的用户名:
史蒂文C.H. Andersson的所以我用这个来产生链接:
@Html.ActionLink(Model.UserName, "UserDetails", new { controller = "Security", id = HttpUtility.UrlEncode(Model.UserName) })
但是当我点击它时,我得到:HTTP错误404.11 - 未找到
如果我点击一个单词的普通用户名,它就像一个魅力。
我认为路由配置不理解这个请求,问题是如何让它工作?
更新
链接:
<a href="/Security/UserDetails/Steven%2bC.H.%2bAndersson">Steven C.H. Andersson</a>
答案 0 :(得分:0)
编码显然是错误的,因为它将空格编码为“%2b”,即“+”。你传递的不是查询字符串参数,而是路径的一部分,所以你需要使用HttpUtility.UrlPathEncode()
答案 1 :(得分:0)
我有同样的问题,这是我如何解决它,但我不确定这是最好的方法。我渴望听到一个更优雅的解决方案。
在视图文件中:
@Html.ActionLink(Model.UserName, "UserDetails", new { controller = "Security", id = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(Model.UserName)) })
在控制器文件中:
id = Encoding.UTF8.GetString(Convert.FromBase64String(id))