MVC 处理数据库操作模型与控制器类
本文关键字:控制器 模型 操作 处理 数据库 MVC | 更新日期: 2023-09-27 18:37:16
我正在创建我的第一个MVC项目,尽管对编码并不陌生。 根据Microsoft:
MVC 模型包含视图或控制器中未包含的所有应用程序逻辑。该模型应包含所有应用程序业务逻辑、验证逻辑和数据库访问逻辑。例如,如果使用Microsoft实体框架访问数据库,则需要在"模型"文件夹中创建实体框架类(.edmx 文件)。视图应仅包含与生成用户界面相关的逻辑。控制器应仅包含返回正确视图或将用户重定向到另一个操作(流控制)所需的最小逻辑。其他所有内容都应包含在模型中。一般来说,你应该努力寻找胖模特和瘦控制器。控制器方法应仅包含几行代码。如果控制器操作变得太胖,则应考虑将逻辑移出到 Models 文件夹中的新类。
起初,我在控制器类中编写了所有数据库逻辑。我已经成功地在模型类中重写了其中的大部分内容,但这种方法存在一些重大问题,我想解决。
首先是所有的 UrlHelper/HttpRequestBase/HttpContext/ModelStateDictionary,所有这些函数都是控制器类的一部分。 它被写得好像你应该在控制器类中执行大部分处理。
例如,注册新帐户后我的控制器类:
[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,因为它们都是控制器类的一部分。
我是否应该将所有这些变量传递到我的模型类中以访问它们? 似乎Microsoft写这个是为了在控制器中执行所有逻辑,即使他们声明不这样做。 只是真的不明白为什么不在控制器中执行此操作,而不必将所有这些变量传递给模型类。
MVC与Microsoft无关 - 这是一个大约20年前的概念。认真地。
是的,模型就是 - 模型。它们中几乎没有逻辑发生(主要是:没有),当我看到你的观点时,我看到了太多的代码。它不是一个模型。
您无权访问模型中的所有变量的原因是您不需要它们。不应执行任何与在模型中呈现数据无关的处理。你这样做。
在您给出的报价中,"模型"是指实体框架模型,即域逻辑。
视图模型应该只关注显示逻辑,例如,在显示之前预处理从后端检索到的一些数据。放置Register
方法的正确位置是控制器或控制器调用的某些应用程序/域服务。
从Visual Studio中的模板创建一个新的MVC项目,并查看AccountController以了解MS如何实现用户注册。
视图是用来"查看"结果的...它被告知要从"控制器"显示什么,控制器获取有关如何从模型中构建数据的信息......
这样。。。
首先,我们需要在模型中定义您的表...
public partial class MyTable
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
获取您的数据,在控制器中对其进行任何修改...
public class MyController : Controller
{
MyEntities db = new MyEntities(); //Set the context for your DB
var dataToPassToView = db.MyTable.ToList(); //Get your data from the DB
//Make any changes/calculations to your data before passing it to the view...
return View(dataToPassToView); //Return the View along with your data
}
和风景...
@model IEnumerable<MyApp.Models.MyTable> //Tell the view what model to use
///Some Code in here to display your data...
如您所见,模型仅定义数据结构。控制器在显示数据之前"控制"数据...视图从控制器中获取成品,并按照指示显示。
下面是将业务逻辑放在模型类中的论据。数据逻辑耦合是面向对象被发明的目的。