我正在创建我的第一个MVC项目,尽管不是编程新手。据微软:MVC处理数据库操作模型vs控制器类
一个MVC模型包含不包含在一个视图或控制器的所有应用程序逻辑的。该模型应该包含您的所有应用程序业务逻辑,验证逻辑和数据库访问逻辑。例如,如果您使用Microsoft Entity Framework来访问数据库,那么您将在Models文件夹中创建实体框架类(您的.edmx文件)。 视图应该只包含与生成用户界面相关的逻辑。控制器应该只包含返回正确视图或将用户重定向到另一个操作(流量控制)所需的最少逻辑。其他一切都应该包含在模型中。一般来说,你应该争取胖的模型和瘦的控制器。你的控制器方法应该只包含几行代码。如果控制器操作太胖,那么您应该考虑将逻辑移出到Models文件夹中的新类。
起初我写的所有数据库逻辑控制器类。我已经成功地在模型类中重写了它的大部分内容,但是这种方法存在一些主要问题,我希望得到澄清。
,首先是所有的UrlHelper/HttpRequestBase /的HttpContext/ModelStateDictionary,所有这些功能都是您控制器类的一部分。它被写成好像你应该在控制器类中完成大部分的处理。
例如我的控制器类,一旦你注册一个新的账号:
而且我的模型类:
public bool register(RegisterViewModel model, UrlHelper url, HttpRequestBase request, ModelStateDictionary modelState)
{
if (userManager.FindByEmail(model.Email) != null)
{
modelState.AddModelError("Email", "Error, already have this email registered!");
return false;
}
else
{
MyIdentityUser user = new MyIdentityUser();
user.Email = model.Email;
user.FullName = model.FullName;
user.UserName = model.Email;
IdentityResult result = userManager.Create(user, model.Password);
if (result.Succeeded)
{
userManager.AddToRole(user.Id, "ReadOnly");
string code = userManager.GenerateEmailConfirmationToken(user.Id);
var callbackUrl = url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: request.Url.Scheme);
userManager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking" + System.Environment.NewLine + "<a style=\"border:15px solid #00FF00;background-color:#00FF00;color:#000;font-size:14px; font-family:Arial;text-decoration:none\" href =\"" + callbackUrl + "\">here</a>");
return true;
}
else
{
modelState.AddModelError("Email", "Error while creating the user!");
return false;
}
}
}
在这个模型类,我到ModelState中,UrlHelper进不去, HttpRequestBase,因为它们都是控制器类的一部分。
我是否应该将所有这些变量传入我的模型类以访问它们?看起来像微软写这个来做控制器中的所有逻辑,即使他们不这样做。只是不明白为什么不在控制器中这样做,不必将所有这些变量传递给模型类。
哦,没有。我喜欢将它概念化的方式是我们有用于与数据库进行通信的实体模型(通过实体框架)。这些是POCO类。控制器出去拿取我们的实体,我们填充ViewModel以满足我们的特定需求(例如添加发票)。然后我们用ViewModel调用我们的视图,当表单发回时我们验证并保存。看到这个https://lostechies.com/jimmybogard/2009/04/24/how-we-do-mvc/ –