C# MVC阻止更新某些字段

C# MVC阻止更新某些字段,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我有一个使用存储库模式和实体框架6的ASP.NETMVC4应用程序 当我访问User/Details/5页面并更新用户详细信息时,出现以下错误- 属性“Password”不能设置为空值 在我看来,除了密码,我还有所有这些字段,因为在这个视图中我不需要它。我如何(本质上)告诉MVC不要在这个视图中更新密码 这是我的用户模型 public class UserModel : IUserModel { public int Id{ get; set; } [DisplayName("

我有一个使用存储库模式和实体框架6的ASP.NETMVC4应用程序

当我访问User/Details/5页面并更新用户详细信息时,出现以下错误-

属性“Password”不能设置为空值

在我看来,除了密码,我还有所有这些字段,因为在这个视图中我不需要它。我如何(本质上)告诉MVC不要在这个视图中更新密码

这是我的用户模型

public class UserModel : IUserModel
{
    public int Id{ get; set; }

    [DisplayName("Employee Number")]
    public int EmployeeNumber { get; set; }

    [DisplayName("First Name")]
    public string Firstname { get; set; }

    [DisplayName("Last Name")]
    public string Surname { get; set; }

    public string Email { get; set; }

    [DisplayName("User Type")]
    public UserType UserType { get; set; }

    [DisplayName("Login")]
    public UserStatus UserStatus { get; set; }

    [DisplayName("Login Status")]
    public bool LoginStatus { get; set; }

    public string Password { get; set; }

    [ReadOnly(true)]
    public DateTime DateCreated { get; set; }

    [ReadOnly(true)]
    public int CreatedBy { get; set; }

    [ReadOnly(true)]
    public DateTime LastUpdated { get; set; }

    [ReadOnly(true)]
    public int LastUpdateBy { get; set; }

    [DisplayName("Full Name")]
    public string SurnameFirstName
    {
        get { return Surname + ", " + Firstname; }
    }

    [NotMapped]
    public State State { get; set; }
}
这是我的控制器-

[HttpPost]
    public ActionResult Details(UserModel model)
    {
        if (ModelState.IsValid)
        {

            _userService.Update(model);

            return RedirectToAction("Index");
        }

        return View(model);
    }
和my_userService.Update方法

public void Update(UserModel entity)
    {
        User u = _userRepository.FindById(entity.Id);

        AutoMapper.Mapper.CreateMap<UserModel, User>();

        _userRepository.Update(AutoMapper.Mapper.Map(entity, u));
    }
public void更新(UserModel实体)
{
用户u=\u userRepository.FindById(entity.Id);
AutoMapper.Mapper.CreateMap();
_Update(AutoMapper.Mapper.Map(entity,u));
}

你的关键句子是:

在我看来,除了密码之外,我还有所有这些字段,因为在这个视图中我不需要它。

您应该定义ViewModels,而不是使用模型(我知道有很多示例与您类似,但最佳实践是使用ViewModels)


ViewModel基本上是一个为视图建模的类,因此它只包含所需的属性。在你得到这些信息后,你可以更新你的模型,正如@krillgar在一篇评论中所说:从数据库中提取用户,只更新你想更新的字段。

你的关键句子是:

在我看来,除了密码之外,我还有所有这些字段,因为在这个视图中我不需要它。

您应该定义ViewModels,而不是使用模型(我知道有很多示例与您类似,但最佳实践是使用ViewModels)


ViewModel基本上是一个为视图建模的类,因此它只包含所需的属性。在您获得此信息后,您可以更新您的模型,正如@krillgar在一篇评论中所说:从数据库中提取用户,并仅更新您要更新的字段。

我认为您应该在未定义密码属性的情况下使用ViewModel。只删除属性表单视图是不安全的。将密码设为空可以吗:
公共字符串?密码{get;set;}
?这将允许将
null
分配给
Password
,但这取决于您希望如何使用模型。但是,如果Password可为null,它会用null覆盖现有密码吗?或者,如果您觉得需要保持原样,则必须为用户调用数据库,在将密码发送到service.update之前设置密码。您的
\u userService.update()方法的作用是什么?您应该从数据库中提取
用户
,并在调用
context.SaveChanges()
之前仅复制在调用过程中可变的属性,以更新从数据库中提取的
用户
,而不是从客户端传递的模型。像保存密码这样的事情应该只通过调用特定的方法来完成。我认为您应该使用ViewModel,其中password属性没有定义。只删除属性表单视图是不安全的。将密码设为空可以吗:
公共字符串?密码{get;set;}
?这将允许将
null
分配给
Password
,但这取决于您希望如何使用模型。但是,如果Password可为null,它会用null覆盖现有密码吗?或者,如果您觉得需要保持原样,则必须为用户调用数据库,在将密码发送到service.update之前设置密码。您的
\u userService.update()方法的作用是什么?您应该从数据库中提取
用户
,并在调用
context.SaveChanges()
之前仅复制在调用过程中可变的属性,以更新从数据库中提取的
用户
,而不是从客户端传递的模型。像保存密码这样的事情只能通过调用特定的方法来完成。