gpt4 book ai didi

c# - ASP.NET Core 2.0 防止重复条目

转载 作者:太空宇宙 更新时间:2023-11-03 22:53:45 24 4
gpt4 key购买 nike

我是 ASP.NET Core MVC 的新手。我正在使用 ASP.NET Core 2.0、C#、EntityFrameworkCore Code First 和 SQL Server 2016。我设法让我的 CRUD 操作按需要工作。

但是,我需要帮助来防止用户在我的表单上多次注册。如果可能的话,我想检查/防止 Controller 端代码中的重复条目,而不是数据库中的重复条目。

如果有人可以提供帮助,我将附上我现在拥有的代码。提前致谢!

模型

public class Employee
{
public int EmployeeID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }

public int DepartmentID { get; set; }
public Department Department { get; set; }

public int AppointmentID { get; set; }
public Appointment Appointment { get; set; }
}

public class Department
{
public int DepartmentID { get; set; }
public string Name { get; set; }

public ICollection<Employee> Employees { get; set; }
}

public class Appointment
{
public int AppointmentID { get; set; }
public string TimeSlot { get; set; }

public ICollection<Employee> Employees { get; set; }
}

View 模型

public class EmployeeFormVM
{
public int EmployeeID { get; set; }

[Required(ErrorMessage = "Please enter your First Name")]
[Display(Name = "First Name")]
[StringLength(50)]
public string FirstName { get; set; }

[Required(ErrorMessage = "Please enter your Last Name")]
[Display(Name = "Last Name")]
[StringLength(50)]
public string LastName { get; set; }

[Required(ErrorMessage = "Please select your Department")]
[Display(Name = "Department")]
public int DepartmentID { get; set; }

public IEnumerable<Department> Departments { get; set; }

[Required(ErrorMessage = "Please select your Appointment")]
[Display(Name = "Appointment")]
public int AppointmentID { get; set; }

public IEnumerable<Appointment> Appointments { get; set; }
}

数据库上下文

public class WinTenDbContext : DbContext
{
public WinTenDbContext(DbContextOptions<WinTenDbContext> options) : base(options)
{
}

public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<Appointment> Appointments { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.HasKey(e => e.EmployeeID);

modelBuilder.Entity<Employee>()
.Property(e => e.FirstName)
.HasColumnType("varchar(50)")
.HasMaxLength(50)
.IsRequired();


modelBuilder.Entity<Employee>()
.Property(e => e.LastName)
.HasColumnType("varchar(50)")
.HasMaxLength(50)
.IsRequired();

modelBuilder.Entity<Department>()
.HasKey(d => d.DepartmentID);

modelBuilder.Entity<Department>()
.Property(d => d.Name)
.HasColumnType("varchar(50)")
.HasMaxLength(50);

modelBuilder.Entity<Appointment>()
.HasKey(a => a.AppointmentID);

modelBuilder.Entity<Appointment>()
.Property(a => a.TimeSlot)
.HasColumnType("varchar(50)")
.HasMaxLength(50);
}
}

员工 Controller

public class EmployeesController : Controller
{
private readonly WinTenDbContext _context;

public EmployeesController(WinTenDbContext context)
{
_context = context;
}

// GET: Employees
public async Task<IActionResult> Index()
{
//return View(await _context.Employees.ToListAsync());

var webAppDbContext = _context.Employees.Include(d => d.Department).Include(a => a.Appointment);
return View(await webAppDbContext.ToListAsync());
}

// GET: Employees/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}

var employee = await _context.Employees
.SingleOrDefaultAsync(m => m.EmployeeID == id);
if (employee == null)
{
return NotFound();
}

return View(employee);
}

// GET: Employees/Create
public IActionResult Create()
{
var departments = _context.Departments.ToList();
var appointments = _context.Appointments.ToList();

var viewModel = new EmployeeFormVM
{
Departments = departments,
Appointments = appointments
};

return View(viewModel);
}

// POST: Employees/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(EmployeeFormVM employee)
{
if (ModelState.IsValid)
{
var emp = new Employee();
{
emp.FirstName = employee.FirstName;
emp.LastName = employee.LastName;
emp.DepartmentID = employee.DepartmentID;
emp.AppointmentID = employee.AppointmentID;
}
_context.Add(emp);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}

else
{
employee.Departments = _context.Departments.ToList();
employee.Appointments = _context.Appointments.ToList();
return View(employee);
}
}

// GET: Employees/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}

var employeevm = new EmployeeFormVM();
{
Employee employee = await _context.Employees.SingleOrDefaultAsync(m => m.EmployeeID == id);

if (employee == null)
{
return NotFound();
}

employeevm.EmployeeID = employee.EmployeeID;
employeevm.FirstName = employee.FirstName;
employeevm.LastName = employee.LastName;

// Retrieve list of Departments
var departments = _context.Departments.ToList();
employeevm.Departments = departments;
// Set the selected department
employeevm.DepartmentID = employee.DepartmentID;

// Retrieve list of Appointments
var appointments = _context.Appointments.ToList();
employeevm.Appointments = appointments;
// Set the selected department
employeevm.AppointmentID = employee.AppointmentID;
}
return View(employeevm);
}

// POST: Employees/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(EmployeeFormVM vmEdit)
{
if (ModelState.IsValid)
{
Employee employee = _context.Employees.SingleOrDefault(e => e.EmployeeID == vmEdit.EmployeeID);

if (employee == null)
{
return NotFound();
}

employee.FirstName = vmEdit.FirstName;
employee.LastName = vmEdit.LastName;
employee.DepartmentID = vmEdit.DepartmentID;
employee.AppointmentID = vmEdit.AppointmentID;

try
{
_context.Update(employee);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!EmployeeExists(vmEdit.EmployeeID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(vmEdit);
}

// GET: Employees/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}

var employee = await _context.Employees
.SingleOrDefaultAsync(m => m.EmployeeID == id);
if (employee == null)
{
return NotFound();
}

return View(employee);
}

// POST: Employees/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var employee = await _context.Employees.SingleOrDefaultAsync(m => m.EmployeeID == id);
_context.Employees.Remove(employee);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}

private bool EmployeeExists(int id)
{
return _context.Employees.Any(e => e.EmployeeID == id);
}
}

创建 View

@using (Html.BeginForm("Create", "Employees"))
{
<div class="form-group">
@Html.LabelFor(e => e.FirstName)
@Html.TextBoxFor(e => e.FirstName, new { @class = "form-control" })
@Html.ValidationMessageFor(e => e.FirstName)
</div>

<div class="form-group">
@Html.LabelFor(e => e.LastName)
@Html.TextBoxFor(e => e.LastName, new { @class = "form-control" })
@Html.ValidationMessageFor(e => e.LastName)
</div>

<div class="form-group">
@Html.LabelFor(d => d.DepartmentID)
@Html.DropDownListFor(d => d.DepartmentID, new SelectList(Model.Departments, "DepartmentID", "Name"), "", new { @class = "form-control" })
@Html.ValidationMessageFor(d => d.DepartmentID)
</div>

<div class="form-group">
@Html.LabelFor(a => a.AppointmentID)
@Html.DropDownListFor(a => a.AppointmentID, new SelectList(Model.Appointments, "AppointmentID", "TimeSlot"), "", new { @class = "form-control" })
@Html.ValidationMessageFor(a => a.AppointmentID)
</div>

<div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
}

最佳答案

您当然可以从代码端检查重复条目,但您当然需要对数据库运行查询才能实现此目的。根据您发布的代码,您已经在 EmployeesController.Edit 中做了类似的事情:

Employee employee = await _context.Employees.SingleOrDefaultAsync(
m => m.EmployeeID == id);

if (employee == null)
{
return NotFound();
}

您可以采用这种方法并将变体应用于 EmployeesController.Create。例如:

Employee existingEmployee = await _context.Employees.SingleOrDefaultAsync(
m => m.FirstName == employee.FirstName && m.LastName == employee.LastName);

if (existingEmployee != null)
{
// The employee already exists.
// Do whatever you need to do - This is just an example.
ModelState.AddModelError(string.Empty, "This employee already exists.");
employee.Departments = _context.Departments.ToList();
employee.Appointments = _context.Appointments.ToList();
return View(employee);
}

// Your existing code for creating a new employee.

我在 SingleOrDefaultAsync 中使用的表达式只是一个示例:您需要根据自己的要求来决定是什么让员工与众不同。

要查看添加到我显示的 Controller 代码中的错误消息,您需要更新创建 View :

@using (Html.BeginForm("Create", "Employees"))
{
@Html.ValidationSummary(true)
...

关于c# - ASP.NET Core 2.0 防止重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46434735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com