gpt4 book ai didi

c# - MVC 处理数据库操作模型与 Controller 类

转载 作者:太空宇宙 更新时间:2023-11-03 12:50:22 25 4
gpt4 key购买 nike

我正在创建我的第一个 MVC 项目,虽然对编码并不陌生。据微软称:

MVC 模型包含 View 或 Controller 中未包含的所有应用程序逻辑。该模型应包含所有应用程序业务逻辑、验证逻辑和数据库访问逻辑。例如,如果您使用 Microsoft Entity Framework 访问您的数据库,那么您将在 Models 文件夹中创建您的 Entity Framework 类(您的 .edmx 文件)。 View 应该只包含与生成用户界面相关的逻辑。 Controller 应该只包含返回正确 View 或将用户重定向到另一个操作(流控制)所需的最低限度的逻辑。其他一切都应该包含在模型中。一般来说,你应该争取胖模型和瘦 Controller 。您的 Controller 方法应该只包含几行代码。如果 Controller 操作变得太胖,那么您应该考虑将逻辑移出到 Models 文件夹中的一个新类。

一开始我把所有的数据库逻辑都写在了controller类中。我已经成功地在模型类中重写了其中的大部分内容,但是我想解决这种方法存在的主要问题。

首先是所有 UrlHelper/HttpRequestBase/HttpContext/ModelStateDictionary,所有这些功能都是 Controller 类的一部分。它被写成好像你应该在 Controller 类中完成大部分处理。

例如,您注册新帐户后我的 Controller 类:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
if (accountModel.register(model, Url, Request, ModelState) == true)
return RedirectToAction("Login", "Account");
}
return View(model);
}

还有我的模型类:

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,因为它们都是 Controller 类的一部分。

我是否应该将所有这些变量传递到我的模型类中以访问它们?似乎 Microsoft 编写此代码是为了执行 Controller 中的所有逻辑,即使他们声明不这样做。只是真的不明白为什么不在 Controller 中执行此操作而不必将所有这些变量传递给模型类。

最佳答案

MVC 与微软无关——它是大约 20 年前的概念。说真的。

是的,模型就是模型。它们中几乎没有逻辑(大多数情况下:没有),当我看到你的观点时,我看到了太多的代码。它不是模型。

您无法访问模型中所有这些变量的原因是您不需要它们。您不应进行任何与在模型中呈现数据无关的处理。你做什么。

关于c# - MVC 处理数据库操作模型与 Controller 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35776107/

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