MVC 处理数据库操作模型与控制器类



我正在创建我的第一个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...

如您所见,模型仅定义数据结构。控制器在显示数据之前"控制"数据...视图从控制器中获取成品,并按照指示显示。

下面是将业务逻辑放在模型类中的论据。数据逻辑耦合是面向对象被发明的目的。

最新更新