gpt4 book ai didi

asp.net-mvc - ASP.NET MVC - 创建新模型或使用 Entity Framework 类

转载 作者:行者123 更新时间:2023-12-04 11:56:55 25 4
gpt4 key购买 nike

我正在开发一个 ASP.NET MVC 3 应用程序,我首先使用实体​​框架代码来创建我的应用程序的类,并且我还有一个存储库以便对其执行操作,保持 DBContext 和 DBEntities 的清洁定义。

我的疑问是关于 View 的渲染和编辑模型的保存方式。

如果我有这个代表存储在我的数据库中的用户的实体:

//Entity:
public class User
{
[Key]
public int IdUser { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}

我想显示一个包含名字、姓氏、电子邮件和新密码、确认密码和当前密码的 View ,以便让用户更改他的数据,输入 CurrentPassword 以确认更改,所以我的怀疑是,像 ConfirmPasword 和 CurrentPassword 这样的字段不是't 在我的实体中,所以我需要为此 View 创建一个新模型,并将我想要的信息从我的新模型复制到我的数据库实体以保存它?喜欢:
public class UpdateUserModel
{

[Required]
[Display(Name = "Name")]
public string FirstName{ get; set; }

[Required]
[Display(Name = "Last Name")]
public string LastName{ get; set; }

[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Not valid email")]
public string Email { get; set; }

[DataType(DataType.Password)]
[Display(Name = "New password")]
public string NewPasword{ get; set; }

[DataType(DataType.Password)]
[Display(Name = "Confirm the New Pasword")]
[Compare("NewPasword", ErrorMessage = "Password doesn´t mach.")]
public string ConfirmPasword{ get; set; }

[Required(ErrorMessage = "Need to specify the current password to save changes")]
[DataType(DataType.Password)]
[Display(Name = "Current Password")]
public string CurrentPassword { get; set; }
}

在 Controller 中我做了:
public ActionResult UpdateUser(UpdateUserModel model)
{
User u = (User)Membership.GetUser();
u.FirstName = model.FirstName;
u.LastName = model.LastName;
u.Email = model.Email;

if (!String.IsNullOrEmpty(model.NewPassword))
{
u.Password = FormsAuthentication.HashPasswordForStoringInConfigFile(model.NewPassword.Trim(), "md5");
}

repository.UpdateUser(u);

return View();
}

有一个 Controller 可以做到这一点,例如:
public ActionResult UpdateUser(User u)
{
repository.UpdateUser(u);
return View();
}

因为如果我有这个,我如何添加诸如 ConfirmPassword 或 CurrentPassword 之类的字段,以便对此特定 View 进行验证。

最佳答案

如果我是你,我不会在我的表示层中使用域模型。我将创建一个与我的域模型非常相似的 View 模型(另一个类)。然后我会使用自动映射工具从我的域模型映射到 View 模型。

这是一个非常常见的场景,因此如果您在 Google 上搜索“ View 和域”模型,您应该可以找到所需的一切。

public class User {
[Key]
public int IdUser { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }

}

public class UpdateUserViewModel {
// Original fields

public string Password { get; set; }

public string PasswordConfirmation { get; set;
}

然后,您可以配置自动映射器以删除样板代码:
public ActionResult ShowUser()
{
var domainModel = new User(); // I'm assuming that properties are set somewhere
var viewModel = new UserViewModel();

Autommaper.Map(domainModel, viewModel);

return View(viewModel);
}

这很粗糙,但希望你能有一个想法。

更新 1:**

As i understood is better to create a new model for each view and then map it into the entity



它不仅更好,而且提供更好的关注点分离,使您的代码易于测试。仅通过查看类的名称,我就可以看到其用途 UpdateUserViewModel、RegisterUserViewModel 等)。

Original fields, in this class is supposed to be the Metadata with the validation and that stuff isn't?



通过原始字段,我的意思是:
public class UserViewModel{
public string UserName { get; set; }
public string FirstName { get; set; }

}

这些字段已经在您的 User 类中,因此我不再输入它们,从而节省了时间。

This will be change my model from MVC to MVVM or not beacuse i still have a controller?



我相信我所建议的仍然是 MVC 模式,而不是 MVVM。

About the Automaper, are you using github.com/AutoMapper/AutoMapper?



Automapper 是我用过的东西。那里的工具很少,它们几乎可以做同样的事情。尝试几个,然后找到最适合您的要求。

祝你好运。

关于asp.net-mvc - ASP.NET MVC - 创建新模型或使用 Entity Framework 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9887660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com