用户管理员使用MVC6

时间:2016-03-22 19:18:01

标签: asp.net-core-mvc

我想弄清楚我错在哪里。
我在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不是字符串。我试图将参数定义为对象,但我在调试中看不到哪种对象。

2 个答案:

答案 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

  • 等网址


希望这有助于:)