我想弄清楚我错在哪里。
我在Startup.cs配置功能中创建了 admin 角色。
我添加了一个简单的网页,它可以正常工作并显示用户列表。
@model IEnumerable<MyProject.ViewModels.Account.UserIndexViewModel>
@{
ViewData["Title"] = "UsersList";
}
<h2>Users List</h2>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.UserName)
</th>
<th>
@Html.DisplayNameFor(model => model.Email)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.UserName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Email)
</td>
<td>
<a asp-action="UserDetails" asp-route-id="@item.UserName">Details</a> |
</td>
</tr>
}
</table>
当我试图获取用户的详细信息时,cshtml页面会正确生成地址Account / UserDetails / NameSurname,并调用AccountController.cs中的UserDetails函数:
[HttpGet]
[Authorize(Roles = "admin")]
public IActionResult UserDetails(string userName)
{
return View();
}
问题是userName不是字符串。我试图将参数定义为对象,但我在调试中看不到哪种对象。
答案 0 :(得分:0)
我找到了问题的解决方案,也许不是最优雅的。 我没有使用新的asp-action关键字来调用,而是使用了老式的@ Html.ActionLink:
@Html.ActionLink("Details", "UserDetails", "Account", routeValues: new { userName = item.userName })
这样,AccountController中的UserDetails函数被正确调用,参数正确地路由到函数。
答案 1 :(得分:0)
第一件事:
问题是userName不是字符串。我试图将参数定义为对象,但我在调试中看不到哪种对象。
这是因为您使用Check FnArity 3 : (forall A B C : Set, A -> B -> C).
作为操作参数,可能使用默认路由userName
,因此默认id
未映射到id
。
您有3个选项:
将操作参数更改为userName
- &gt; id
或在Startup.cs中添加public IActionResult UserDetails(string id)
的新路由
userName
或使用app.UseMvc(routes =>
{
routes.MapRoute(
name: "userdetails",
template: "Account/UserDetails/{userName?}",
defaults: new { controller="Account", action="UserDetails" });
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
之类的链接代替Account/UserDetails?userName=xxx
在我看来,1选项是一种很好的做法,因为在你的场景中默认路由已经足够了,只有在真正需要时才应添加新路由。
第二件事:
你有施工:
&lt; asp-action =“UserDetails”asp-route-id =“@ item.UserName”&gt; Details&lt; / A&GT;
上述说明存在错误 - 您已将值分配给 ID (Account/UserDetails/NameSurname
),但应分配给 userName ({{1 }})
asp-route-id
这种构造非常巧妙,并根据您的路线配置为您提供正确的链接:
在你的情况下(我假设默认路线)它会给你类似的东西:
asp-route-userName
但是,如果您将操作参数更新为<a asp-action="UserDetails" asp-route-userName="@item.UserName">Details</a>
或添加新路线(例如上面的示例),则会为您提供Account/UserDetails?userName=JohnDoe
希望这有助于:)