路线匹配参数,而不是动作名称/视图未正确返回

时间:2014-04-12 22:18:15

标签: c# asp.net-mvc asp.net-routing

我想创建一个如下所示的网址:

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,而不是包含用户名的页面。为什么会这样?

2 个答案:

答案 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);
}
相关问题