C# 排除型号';s Password字段WITHOUT导致模型验证失败
我正在使用EntityFramework和.NETCore中的MVC,遇到了一个我不确定如何处理的问题。我有一个带有C# 排除型号';s Password字段WITHOUT导致模型验证失败,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,我正在使用EntityFramework和.NETCore中的MVC,遇到了一个我不确定如何处理的问题。我有一个带有密码字段的用户模型。我希望编辑用户模型,但我不希望密码字段与其他用户字段出现在同一编辑视图中。隐藏密码很容易,但现在保存编辑时模型总是无法验证 我只是在视图中隐藏了password字段,它可以正常工作,但会将密码显示在页面源代码上。我还尝试创建了一个UserEditView模型,但这会创建很多翻译代码,而这些代码对于我试图实现的目标来说是不必要的 任何帮助都将不胜感激。下面是我一直
密码
字段的用户模型。我希望编辑用户模型,但我不希望密码
字段与其他用户字段出现在同一编辑视图中。隐藏密码很容易,但现在保存编辑时模型总是无法验证
我只是在视图中隐藏了password字段,它可以正常工作,但会将密码显示在页面源代码上。我还尝试创建了一个UserEditView
模型,但这会创建很多翻译代码,而这些代码对于我试图实现的目标来说是不必要的
任何帮助都将不胜感激。下面是我一直在使用的代码
型号:User.cs
public class User
{
[Display(Name="User ID")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required()]
[Display(Name="Email Address")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required()]
public string Name { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Required()]
public string Salt { get; set; }
}
编辑操作:UsersController.cs
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var employee = await _context.Employees.SingleOrDefaultAsync(m => m.ID == id);
if (employee == null)
{
return NotFound();
}
ViewData["LocationID"] = new SelectList(_context.Locations, "ID", "Address", employee.LocationID);
ViewData["PositionID"] = new SelectList(_context.Jobs, "ID", "Name", employee.PositionID);
return View(employee);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,Email,Name,LocationID,PositionID")] Employee employee)
{
if (id != employee.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(employee);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!EmployeeExists(employee.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
ViewData["LocationID"] = new SelectList(_context.Locations, "ID", "Address", employee.LocationID);
ViewData["PositionID"] = new SelectList(_context.Jobs, "ID", "Name", employee.PositionID);
return View(employee);
}
公共异步任务编辑(int?id)
{
if(id==null)
{
返回NotFound();
}
var employee=await_context.Employees.SingleOrDefaultAsync(m=>m.ID==ID);
if(employee==null)
{
返回NotFound();
}
ViewData[“LocationID”]=新的选择列表(\u context.Locations,“ID”,“Address”,employee.LocationID);
ViewData[“PositionID”]=新的选择列表(_context.Jobs,“ID”,“Name”,employee.PositionID);
返回视图(员工);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务编辑(int-id,[Bind(“id,Email,Name,LocationID,PositionID”)]Employee)
{
if(id!=employee.id)
{
返回NotFound();
}
if(ModelState.IsValid)
{
尝试
{
_上下文更新(员工);
wait_context.SaveChangesAsync();
}
catch(DbUpdateConcurrencyException)
{
如果(!EmployeeExists(employee.ID))
{
返回NotFound();
}
其他的
{
投掷;
}
}
返回重定向到操作(名称(索引));
}
ViewData[“LocationID”]=新的选择列表(\u context.Locations,“ID”,“Address”,employee.LocationID);
ViewData[“PositionID”]=新的选择列表(_context.Jobs,“ID”,“Name”,employee.PositionID);
返回视图(员工);
}
在控制器中,您可以执行以下操作:
ModelState.Remove("Password");
这将阻止验证该字段
然而,这不是一个非常干净的解决方案。如果当前视图中没有使用该字段,则应该考虑将该字段移到另一个模型。在控制器中,可以执行以下操作:
ModelState.Remove("Password");
这将阻止验证该字段
然而,这不是一个非常干净的解决方案。如果当前视图中没有使用该字段,则应该考虑将该字段移到另一个模型。更改模型,使其不具有该属性。为特定视图设计模型没有什么错,事实上,这是MVC的一种观点。您可以从发送的id中查找密码,设置employee.password=[looked up password],然后保存吗?我不会向视图公开密码,但在控制器中使用密码不应该有任何问题。@Crowcoder这是我尝试过的事情之一,但在我尝试使用实体框架并搭建控制器时,我不断得到一个错误,
UserEditViewModel
表不存在。是的,您必须将服务层的复杂性添加到数据层表示的抽象视图模型中。如果软件的复杂性保证了这一点,这是一种常见的做法-只有你才会知道这是否值得努力。这只是一个示例应用程序,因此我可以习惯.NET Core,因此今天可能不会出现服务层。请更改你的模型,使其不具有该属性。为特定视图设计模型没有什么错,事实上,这是MVC的一种观点。您可以从发送的id中查找密码,设置employee.password=[looked up password],然后保存吗?我不会向视图公开密码,但在控制器中使用密码不应该有任何问题。@Crowcoder这是我尝试过的事情之一,但在我尝试使用实体框架并搭建控制器时,我不断得到一个错误,UserEditViewModel
表不存在。是的,您必须将服务层的复杂性添加到数据层表示的抽象视图模型中。如果软件的复杂性保证了这一点,这是一种常见的做法-只有你才会知道这是否值得。这只是一个示例应用程序,因此我可以习惯.NET Core,所以今天可能不会出现服务层。从ModelState中删除密钥并不能解决验证错误,但Customer ViewModel无疑是解决此问题的最佳方法这就是我现在要做的。从ModelState中删除密钥并不能解决验证错误,但是Customer ViewModel绝对是最好的方法,所以这就是我现在要做的。