【发布时间】: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'。)'
【问题讨论】:
标签: c# asp.net asp.net-core razor-pages