Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 排除型号';s Password字段WITHOUT导致模型验证失败_C#_Entity Framework_Asp.net Core - Fatal编程技术网

C# 排除型号';s Password字段WITHOUT导致模型验证失败

C# 排除型号';s Password字段WITHOUT导致模型验证失败,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,我正在使用EntityFramework和.NETCore中的MVC,遇到了一个我不确定如何处理的问题。我有一个带有密码字段的用户模型。我希望编辑用户模型,但我不希望密码字段与其他用户字段出现在同一编辑视图中。隐藏密码很容易,但现在保存编辑时模型总是无法验证 我只是在视图中隐藏了password字段,它可以正常工作,但会将密码显示在页面源代码上。我还尝试创建了一个UserEditView模型,但这会创建很多翻译代码,而这些代码对于我试图实现的目标来说是不必要的 任何帮助都将不胜感激。下面是我一直

我正在使用EntityFramework和.NETCore中的MVC,遇到了一个我不确定如何处理的问题。我有一个带有
密码
字段的用户模型。我希望编辑用户模型,但我不希望
密码
字段与其他用户字段出现在同一编辑视图中。隐藏密码很容易,但现在保存编辑时模型总是无法验证

我只是在视图中隐藏了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绝对是最好的方法,所以这就是我现在要做的。