首页 > 解决方案 > 使用 asp.net core 2.1 执行获取操作

问题描述

我正在研究 asp.net core 2.1

现在我们有如下类的视图:

在此处输入图像描述

每个视图都有自己的类,我的类有OnGet()方法,所以我认为这是页面加载时的 Get 请求。但是我在该方法中设置了断点并且从未命中。

我想做一个简单的方法来在我的视图中做一个 SelectList,比如:

public void OnGet()
        {

            var roles = _roleManager.Roles.ToList();

            List<SelectListItem> item = roles.ConvertAll(a =>
            {
                return new SelectListItem()
                {
                    Text = a.Id.ToString(),
                    Value = a.Name.ToString(),
                };
            }).ToList();

            var vm = new ApplicationRoleViewModel();

            vm.RolesToUser = roles
                         .Select(a => new SelectListItem()
                         {
                             Value = a.Id.ToString(),
                             Text = a.Name
                         })
                         .ToList();


            return ;
        }

看法:

 <select asp-for="RoleId" asp-items="@Model.RolesToUser">
        <option>Please select one</option>
    </select>

但它总是抛出 null 因为它从不返回结果OnGet(),我的问题是。如何在这种新的视图结构中执行简单的获取操作!问候完整代码:

AssignRoleToUser.cshtml.cs

namespace Security.WebUi.Pages
{
    public class AssignRoleToUserModel : PageModel
    {

        private readonly RoleManager<ApplicationRole> _roleManager;

        public AssignRoleToUserModel(
             RoleManager<ApplicationRole> roleManager
            )
        {
            _roleManager = roleManager;
        }


        public void OnGet()
        {

            var roles = _roleManager.Roles.ToList();

            List<SelectListItem> item = roles.ConvertAll(a =>
            {
                return new SelectListItem()
                {
                    Text = a.Id.ToString(),
                    Value = a.Name.ToString(),
                };
            }).ToList();

            var vm = new ApplicationRoleViewModel();

            vm.RolesToUser = roles
                         .Select(a => new SelectListItem()
                         {
                             Value = a.Id.ToString(),
                             Text = a.Name
                         })
                         .ToList();


            return ;
        }


    }
}

看法:

@page
@model Security.Dto.ViewModels.ApplicationRoleViewModel


    <h4>Assign role to user</h4>
    <hr />
    <div asp-validation-summary="All" class="text-danger"></div>
    <select asp-for="RoleId" asp-items="@Model.RolesToUser">
        <option>Please select one</option>
    </select>

    <br />


@section Scripts {

}

应用角色视图模型:

namespace Security.Dto.ViewModels
{
    public class ApplicationRoleViewModel
    {
        public Guid RoleId { get; set; }
        public List<SelectListItem> RolesToUser { get; set; }
    }
}

标签: c#asp.netasp.net-core.net-coreasp.net-core-2.1

解决方案


显然,您正在使用 Razor Page。使用 Razor Pages,视图模型就是它PageModel本身,即您的代码隐藏文件。在您的OnGet操作中,您正在新建一些随机类,并在其上设置一个属性,但随后它只会被垃圾收集。相反,您应该自己拥有此RolesToUser属性PageModel,并设置:

public IEnumerable<SelectListItem> RolesToUser { get; set; }

...

public void OnGet()
{
    var roles = _roleManager.Roles.ToList();

    RolesToUser = roles.Select(a => new SelectListItem()
    {
        Value = a.Id.ToString(),
        Text = a.Name
    }).ToList();
}

推荐阅读