MVC阻止更新某些字段

时间:2014-07-21 12:37:03

标签: c# asp.net-mvc entity-framework

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

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

  

该物业'密码'不能设置为空值。

在我看来,除了密码之外,我有所有这些字段,因为我在这个视图中不需要它。我怎样(基本上)告诉MVC不要在这个视图中更新密码?

这是我的UserModel

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);
    }

我的_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));
    }

1 个答案:

答案 0 :(得分:4)

你的关键句是:

In my view, I have all these fields apart from Password, as I have no need for it in this view.

您应该定义 ViewModels 而不是使用模型(我知道有很多例子与您一样,但最佳做法是使用视图模型)。

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