RuntimeBinderException:'System.Type.GetProperty(string)' 的最佳重载方法匹配有一些无效参数



我正在学习Asp.net Core,并使用CRUD操作、SQL server和实体框架构建一个简单的web。

当应用程序试图编译时,我会记录以下错误:

RuntimeBinderException: The best overloaded method match for 'System.Type.GetProperty(string)' has some invalid arguments 

我知道问题就在这一行,如何在GetProperty中传递动态,或者有其他方法吗?:

var propertyInfo = typeof(Employee).GetProperty(ViewBag.SortField);

那是我的型号:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace EmployeesApp.Models
{
[Table("Employee", Schema ="dbo")]
public class Employee
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Display(Name ="Employee ID")]
public int EmployeeId { get; set; }

[Required]
[Column(TypeName ="varchar(5)")]
[MaxLength(5)]
[Display(Name ="Employee Number")]
public string EmployeeNumber { get; set; }

[Required]
[Column(TypeName = "varchar(150)")]
[MaxLength(100)]
[Display(Name = "Employee Name")]
public string EmployeeName { get; set; }

[Required]
[DataType(DataType.Date)]
[Display(Name ="Date of Birth")]
[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}")]
public DateTime DOB { get; set; }

[Required]
[DataType(DataType.Date)]
[Display(Name = "Hiring Date")]
[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}")]
public DateTime HiringDate { get; set; }

[Required]
[Column(TypeName ="decimal(12,2)")]
[Display(Name ="Gross Salary")]
public decimal GrossSalary { get; set; }

[Required]
[Column(TypeName = "decimal(12,2)")]
[Display(Name = "Net Salary")]
public decimal NetSalary { get; set; }

[ForeignKey("Department")]
[Required]
public int DepartmentId { get; set; }

[Display(Name = "Department")]
[NotMapped]
public string DepartmentName { get; set; }

public virtual Department Department { get; set; }
}
}

那是我的控制器:

namespace EmployeesApp.Controllers
{
public enum SortDirection
{
Ascending,
Descending
}

public class EmployeeController : Controller
{

HRDatabaseContext dbContext = new HRDatabaseContext();
public IActionResult Index(string SortField, string CurrentSortField, SortDirection SortDirection)
{
var employees = GetEmployees();
return View(this.SortEmployees(employees, SortField, CurrentSortField, SortDirection));
}

private List<Models.Employee> GetEmployees()
{
return (from Employee in dbContext.Employees
join Department in dbContext.Departments on Employee.DepartmentId equals Department.DepartmentId
select new Models.Employee
{
EmployeeId = Employee.EmployeeId,
EmployeeName = Employee.EmployeeName,
DOB = Employee.DOB,
HiringDate = Employee.HiringDate,
GrossSalary = Employee.GrossSalary,
NetSalary = Employee.NetSalary,
DepartmentId = Employee.DepartmentId,
DepartmentName = Department.DepartmentName
}).ToList();
}

public IActionResult Add()
{
ViewBag.Department = this.dbContext.Departments.ToList();
return View();
}

[HttpPost]
public IActionResult Add(Models.Employee model)
{
ModelState.Remove("EmployeeID");
ModelState.Remove("Department");
ModelState.Remove("DepartmentName");
if (ModelState.IsValid)
{
dbContext.Employees.Add(model);
dbContext.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.Department = dbContext.Departments.ToList();
return View("Add", model);
}

public IActionResult Edit(int ID)
{
HRDatabaseContext dbContext1 = dbContext;
Models.Employee data = dbContext1.Employees.Where(e => e.EmployeeId == ID).FirstOrDefault();

ViewBag.Department = this.dbContext.Departments.ToList();
return View("Add", data);
}

[HttpPost]
public IActionResult Edit(Models.Employee model)
{
ModelState.Remove("EmployeeID");
ModelState.Remove("Department");
ModelState.Remove("DepartmentName");
if (ModelState.IsValid)
{
dbContext.Employees.Update(model);
dbContext.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.Department = dbContext.Departments.ToList();
return View();
}

public IActionResult Delete(int ID)
{
Models.Employee data = this.dbContext.Employees.Where(e => e.EmployeeId == ID).FirstOrDefault();
if (data != null)
{
dbContext.Employees.Remove(data);
dbContext.SaveChanges();
}
return RedirectToAction("Index");
}

private List<Employee> SortEmployees(List<Employee> employees, String sortField, string currentSortField, SortDirection sortDirection)

{
if (string.IsNullOrEmpty(sortField))
{

ViewBag.SortField = "EmployeeNumber";
ViewBag.SortField = SortDirection.Ascending;
}
else
{
if (currentSortField == sortField)

{
ViewBag.SortDirection = sortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending;

}
else
ViewBag.SortDirection = sortDirection == SortDirection.Ascending;
ViewBag.SortField = sortField;
}
//* create the sorting proccess
var propertyInfo = typeof(Employee).GetProperty(ViewBag.SortField);
if (ViewBag.SortDirection == SortDirection.Ascending)
{
employees = employees.OrderBy(e => propertyInfo.GetValue(e, null)).ToList();
}
else
{
employees = employees.OrderByDescending(e => propertyInfo.GetValue(e, null)).ToList();
}
return employees;
}
}
}   

您有一个错误

ViewBag.SortField = "EmployeeNumber";
ViewBag.SortField = SortDirection.Ascending;

我认为应该是

ViewBag.SortField = "EmployeeNumber";
ViewBag.SortDirection = SortDirection.Ascending;

最新更新