C# MVC阻止更新某些字段
我有一个使用存储库模式和实体框架6的ASP.NETMVC4应用程序 当我访问User/Details/5页面并更新用户详细信息时,出现以下错误- 属性“Password”不能设置为空值 在我看来,除了密码,我还有所有这些字段,因为在这个视图中我不需要它。我如何(本质上)告诉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("
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()
之前仅复制在调用过程中可变的属性,以更新从数据库中提取的用户
,而不是从客户端传递的模型。像保存密码这样的事情只能通过调用特定的方法来完成。