ASP. Net Ядро 3.1 на странице бритвы показывает ошибку для списка сотрудников - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь преобразовать пример Blazor в ASP. Net Страница Core Razor для целей обучения, но я получаю кучу ошибок на странице Employees.cs html и Employees.cs html .cs, где я я пытаюсь вызвать данные.

Я просто пытаюсь показать данные на этой странице, я не уверен, как и где определить данные вызова функций. Я не использую WebAPI.

Я также пытаюсь найти простой пример CRUD, связанный с asp. net core 3.1, чтобы я знал, как работает поток позже, я могу конвертировать то же самое, используя dapper et c ..

У меня нет опыта работы с MVC или Core

ОБНОВЛЕНИЕ: У меня было несколько ошибок, которые были решены, но единственная ошибка, которую я получаю при запуске, находится в programe.cs

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

сообщение об ошибке

InvalidOperationException: ошибка при проверке дескриптора службы 'ServiceType: RazorCore31.Data.IEmployeeService Время жизни: ограниченная реализацияType: RazorCore31.Data.EmployeeService': невозможно разрешить служба для типа 'RazorCore31.Data.SqlDbContext' при попытке активировать 'RazorCore31.Data.EmployeeService'.

System.AggregateException: 'Некоторые службы не могут быть созданы (ошибка при проверке дескриптора службы' ServiceType : 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.cs html

@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.cs html .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();
} 

enter image description here

InvalidOperationException: ошибка при проверке дескриптора службы 'ServiceType: RazorCore31.Data.IEmployeeService Время жизни: объем реализации Тип: RazorCore31.Data.EmployeeService': невозможно разрешить службу для типа 'RazorCore31.Data.SqlDbContext' при попытке активировать 'RazorCore31.Data.EmployeeService'.

System.AggregateException: 'Некоторые службы не могут быть построены (ошибка при проверке дескриптора службы) 'ServiceType: RazorCore31.Data.IEmployeeService Срок службы: Sc oped OperationType: RazorCore31.Data.EmployeeService ': невозможно разрешить службу для типа' RazorCore31.Data.SqlDbContext 'при попытке активировать' RazorCore31.Data.EmployeeService '.)'

ОШИБКА СООБЩЕНИЯ (Эта ошибка устраняется на основе решения @TanvirArjel) enter image description here enter image description here enter image description here

1 Ответ

1 голос
/ 18 февраля 2020

Напишите 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>
...