我想创建一个如下所示的网址:
www.mywebapp.com/Users/Profile/john
我有UsersController
控制器和Profile
操作,该操作会向“个人资料”页面返回ViewResult
。
我已经创建了一条管理它的路线:
routes.MapRoute(
name: "ProfileRoute",
url: "Users/Profile/{username}",
defaults: new { controller = "Users", action = "Profile", username = UrlParameter.Optional }
);
第一个问题是:如果我按{username}
更改{id}
,则可行。当我将{username}
类似参数放入时,操作会在参数中获得NULL
。为什么这样?
这是我的行动Profile
:
[HttpGet]
public ActionResult Profile(string id) {
if (UsersRepository.GetUserByUsername(id) == null) {
return PartialView("~/Views/Partials/_UsernameNotFound.cshtml", id);
}
return View(id);
}
我添加了一个View页面来显示用户个人资料。但是,当方法结束执行时,我又出现了另一个错误:
The view 'john' or its master was not found or no view engine supports the searched locations.
The following locations were searched:
~/Views/Users/john.aspx
~/Views/Users/john.ascx
...
第二个问题是:我必须显示的页面是Profile
,而不是包含用户名的页面。为什么会这样?
答案 0 :(得分:1)
您收到此错误是因为您正在将字符串(id)传递给View函数,此重载会搜索在字符串中传递名称的视图(在本例中为用户名)。
如果您只是尝试将用户名直接传递给视图,则可以使用类似ViewBag的内容,因此您的代码应如下所示:
public ActionResult Profile(string id) {
if (UsersRepository.GetUserByUsername(id) == null) {
return PartialView("~/Views/Partials/_UsernameNotFound.cshtml", id);
}
ViewBag.Username=id;
return View();
}
答案 1 :(得分:0)
我可能会错误地阅读此内容,但是如果您更改了所需参数的名称 id到用户名,它不应该返回null
[HttpGet]
public ActionResult Profile(string username) {
if (UsersRepository.GetUserByUsername(username) == null) {
return PartialView("~/Views/Partials/_UsernameNotFound.cshtml", id);
}
return View(username);
}