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

时间:2016-03-03 15:21:05

标签: c# asp.net-mvc entity-framework

我正在创建我的第一个MVC项目,虽然不是新编码。根据微软的说法:

MVC模型包含未包含在视图或控制器中的所有应用程序逻辑。该模型应包含所有应用程序业务逻辑,验证逻辑和数据库访问逻辑。例如,如果您使用Microsoft Entity Framework访问数据库,那么您将在Models文件夹中创建Entity Framework类(.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,因为它们都是控制器类的一部分。

我是否应该将所有这些变量传递到我的模型类中以便访问它们?似乎微软写了这个来做控制器中的所有逻辑,即使他们声明不这样做。只是不明白为什么不在控制器中执行它而不必将所有这些变量传递给模型类。

3 个答案:

答案 0 :(得分:1)

MVC与微软无关 - 这是一个大约20年前的概念。严重。

是的,模特是那样的 - 模特。它们中发生了很少的逻辑(大多数情况:没有),当我看到你的观点时,我看到的代码太多了。它不是模型。

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

答案 1 :(得分:0)

在你给出的引文中,&#34;模型&#34;指实体框架模型,即域逻辑。

查看模型应该只关注显示逻辑,例如在显示之前预处理从后端检索的一些数据。放置Register方法的正确位置是Controller或Controller调用的某些应用程序/域服务。

在Visual Studio中从模板创建一个新的MVC项目,并查看AccountController以了解MS如何实现用户注册。

答案 2 :(得分:0)

View是用于“查看”结果的...用于告诉“控制器”显示什么,控制器获取有关如何从模型构建数据的信息...

像这样...

首先,我们需要在模型中定义您的表...

public partial class MyTable
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }   
}

获取您的数据,在Controller中对其进行任何修改......

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...

如您所见,模型仅定义数据结构。 Controller在显示之前“控制”数据......并且View从Controller获取成品,并按照指示显示。