【问题标题】:ASP.Net Core 3.1 razor page show error for list of employeeASP.Net Core 3.1 剃须刀页面显示员工列表错误
【发布时间】:2020-06-02 11:04:31
【问题描述】:

出于学习目的,我正在尝试将 Blazor 示例转换为 ASP.Net Core Razor 页面,但我在Employees.cshtml页面和我试图调用数据的Employees.cshtml.cs中遇到了一堆错误。

我只是想在这个页面上显示数据,我不确定如何以及在哪里定义函数调用数据。我没有使用 WebAPI。

我还试图找到与 asp.net core 3.1 相关的简单 CRUD 示例,以便我知道流是如何工作的,以后我可以使用 dapper 等进行转换。

我之前没有 MVC 或 Core 的经验

更新:我几乎没有错误已解决,但我在运行时遇到的唯一错误是在 programe.cs 中

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();
}

错误信息

InvalidOperationException:验证服务时出错 描述符'ServiceType: RazorCore31.Data.IEmployeeService Lifetime: 范围实施类型:RazorCore31.Data.EmployeeService':无法 解析“RazorCore31.Data.SqlDbContext”类型的服务,而 尝试激活“RazorCore31.Data.EmployeeService”。

System.AggregateException: '有些服务不能 构造(验证服务描述符时出错 '服务类型:RazorCore31.Data.IEmployeeService 生命周期:范围 实施类型:RazorCore31.Data.EmployeeService':无法 解析“RazorCore31.Data.SqlDbContext”类型的服务,而 试图激活'RazorCore31.Data.EmployeeService'。)'

EmployeeService.cs

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using RazorCore31.Models;

namespace RazorCore31.Data
{
    public class EmployeeService: IEmployeeService
    {


        private readonly SqlDbContext _dbContext;

        public EmployeeService(SqlDbContext dbContext)
        {
            _dbContext = dbContext;
        }
        public async Task<List<Employee>> GetEmployees()
        {
            return await _dbContext.Employees.ToListAsync();
        }
        public async Task<bool> CreateEmployee(Employee employee)
        {
            employee.Id = Guid.NewGuid().ToString();
            _dbContext.Add(employee);
            try
            {
                await _dbContext.SaveChangesAsync();
                return true;
            }
            catch (DbUpdateException)
            {
                return false;
            }

        }
        public async Task<Employee> SingleEmployee(string id)
        {
            return await _dbContext.Employees.FindAsync(id);
        }
        public async Task<bool> EditEmployee(string id, Employee employee)
        {
            if (id != employee.Id)
            {
                return false;
            }

            _dbContext.Entry(employee).State = EntityState.Modified;
            await _dbContext.SaveChangesAsync();
            return true;
        }
        public async Task<bool> DeleteEmployee(string id)
        {
            var patient = await _dbContext.Employees.FindAsync(id);
            if (patient == null)
            {
                return false;
            }

            _dbContext.Employees.Remove(patient);
            await _dbContext.SaveChangesAsync();
            return true;
        }

        Task<List<Employee>> IEmployeeService.GetEmployees()
        {
            throw new NotImplementedException();
        }

    }
}

IEmployeeService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using RazorCore31.Models;

namespace RazorCore31.Data
{
    public interface IEmployeeService
    {
        Task<List<Employee>> GetEmployees();
        Task<bool> CreateEmployee(Employee employee);
        Task<bool> EditEmployee(string id, Employee employee);
        Task<Employee> SingleEmployee(string id);
        Task<bool> DeleteEmployee(string id);
    }
}

Employee.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using RazorCore31.Data;

namespace RazorCore31.Models
{
    public class Employee 
    {

        [MaxLength(50)]
        public string Id { get; set; }

        [Required(ErrorMessage = "Name is RRRequired")]
        [StringLength(20, ErrorMessage = "Name is too long.")]
        public string Name { get; set; }

        [Required]
        [StringLength(20)]
        public string Department { get; set; }
        [MaxLength(100)]
        public string Designation { get; set; }
        [MaxLength(100)]
        public string Company { get; set; }
        [MaxLength(100)]
        public string City { get; set; }

    }
}

Employees.cshtml

@page
@model RazorCore31.EmployeesModel
@using RazorCore31.Data
@using RazorCore31.Models
@using System.Collections.Generic
@{
    ViewData["Title"] = "Employees";
}

<h1>Employees list</h1>

<p>List of Employee</p>

@if (employees == null)
{
    <p>Loading page...</p>
}
else
{
    <table class='table'>
        <thead>
            <tr>
                <th>EmpName"</th>
                <th>L["EmpDepartment"]</th>
                <th>L["EmpDesignation"]</th>
                <th>L["EmpCompany"]</th>
                <th>L["EmpCity"]</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var employee in employees)
            {
                <tr>
                    <td>@employee.Name</td>
                    <td>@employee.Department</td>
                    <td>@employee.Designation</td>
                    <td>@employee.Company</td>
                    <td>@employee.City</td>
                    <td>
                        <a href='/editemployee/@employee.Id'>Edit</a>
                        <a href='/deleteemployee/@employee.Id'>Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
}

Employees.cshtml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using RazorCore31.Models;
using RazorCore31.Data;

namespace RazorCore31
{
    public class EmployeesModel : PageModel
    {
       //public  List<Employee> employees ;

        private List<Employee> _empList;

        public void empRepository()
        {
            //_empList = Data.EmployeeService.
        }
        public void OnGet()
        {

        }

        public Task getEmployeesAsync()
        {
            _empList = EmployeeService.GetEmployees();
           // return _empList;
        }

    }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.AddScoped<IEmployeeService, EmployeeService>();
    ///services.AddSingleton<IEmployeeService, EmployeeService>();


}

Program.cs 中的错误

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();
} 

InvalidOperationException:验证服务时出错 描述符'ServiceType: RazorCore31.Data.IEmployeeService Lifetime: 范围实施类型:RazorCore31.Data.EmployeeService':无法 解析“RazorCore31.Data.SqlDbContext”类型的服务,而 尝试激活“RazorCore31.Data.EmployeeService”。

System.AggregateException: '有些服务不能 构造(验证服务描述符时出错 '服务类型:RazorCore31.Data.IEmployeeService 生命周期:范围 实施类型:RazorCore31.Data.EmployeeService':无法 解析“RazorCore31.Data.SqlDbContext”类型的服务,而 试图激活'RazorCore31.Data.EmployeeService'。)'

ERROR MESSAGES(此错误根据@TanvirArjel解决方案解决)

【问题讨论】:

    标签: c# asp.net asp.net-core razor-pages


    【解决方案1】:

    写你的EmployeesModel如下:

    public class EmployeesModel : PageModel
    {
        private readonly IEmployeeService _employeeService;
    
        public EmployeesModel(IEmployeeService employeeService)
        {
            _employeeService = employeeService;
        }
    
        public List<Employee> EmployeeList; // <-- Here is the EmployeeList property
    
        public async Task OnGetAsync()
        {
            EmployeeList = await _employeeService.GetEmployees(); // <-- Populate EmployeeList here
        }
    }
    

    然后在视图中:

    @page
    @model RazorCore31.EmployeesModel
    @using RazorCore31.Data
    @using RazorCore31.Models
    @using System.Collections.Generic
    @{
        ViewData["Title"] = "Employees";
    }
    
    <h1>Employees list</h1>
    
    <table class='table'>
        <thead>
            <tr>
                <th>EmpName"</th>
                <th>L["EmpDepartment"]</th>
                <th>L["EmpDesignation"]</th>
                <th>L["EmpCompany"]</th>
                <th>L["EmpCity"]</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var employee in Model.EmployeeList) //<-- Here it is
            {
                <tr>
                    <td>@employee.Name</td>
                    <td>@employee.Department</td>
                    <td>@employee.Designation</td>
                    <td>@employee.Company</td>
                    <td>@employee.City</td>
                    <td>
                        <a href='/editemployee/@employee.Id'>Edit</a>
                        <a href='/deleteemployee/@employee.Id'>Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    

    【讨论】:

    • 我收到了EmployeeList = _employeeService.GetEmployees(); 无法隐式转换类型的错误...'System.Threading.Tasks.Task&lt;System.Collections.Generic.List&lt;RazorCore31.Models.Employee&gt;&gt;' to 'System.Collections.Generic.List&lt;RazorCore31.Models.Employee&gt;'
    • @Learning 好的!知道了,答案已更新。
    • 当我尝试挑战员工页面时出现另一个错误InvalidOperationException: Unable to resolve service for type 'RazorCore31.Data.EmployeeService' while attempting to activate 'RazorCore31.EmployeesModel'. Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)
    • @Learning 请检查更新的答案。我已将 EmployeeService 替换为 IEmployeeService
    • 这会产生另一个错误employeeService _employeeService = employeeService;... 无法隐式转换类型
    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 2021-04-09
    • 2023-03-17
    • 2020-07-11
    • 2020-07-15
    • 2021-01-05
    • 2021-03-01
    • 1970-01-01
    相关资源
    最近更新 更多