Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC处理数据库操作模型与控制器类_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

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

C# MVC处理数据库操作模型与控制器类,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在创建我的第一个MVC项目,尽管对编码并不陌生。据微软称: MVC模型包含视图或控制器中未包含的所有应用程序逻辑。模型应该包含所有应用程序业务逻辑、验证逻辑和数据库访问逻辑。例如,如果使用Microsoft Entity Framework访问数据库,则应在Models文件夹中创建Entity Framework类(您的.edmx文件)。 视图应仅包含与生成用户界面相关的逻辑。控制器应该只包含返回正确视图或将用户重定向到另一个操作(流控制)所需的最低逻辑。其他所有内容都应该包含在模型中。 总

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

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

首先,我在控制器类中编写了所有数据库逻辑。我已经成功地在model类中重新编写了其中的大部分内容,但是这种方法存在一些主要问题,我想澄清一下

首先是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;
            }
        }
    }
public bool寄存器(RegisterViewModel模型、UrlHelper url、HttpRequestBase请求、ModelStateDictionary modelState)
{
if(userManager.FindByEmail(model.Email)!=null)
{
AddModelError(“电子邮件”,“错误,已注册此电子邮件!”);
返回false;
}
其他的
{
MyIdentityUser用户=新的MyIdentityUser();
user.Email=model.Email;
user.FullName=model.FullName;
user.UserName=model.Email;
IdentityResult result=userManager.Create(用户、模型、密码);
if(result.successed)
{
AddToRole(user.Id,“只读”);
字符串代码=userManager.GenerateEmailConfirmationToken(user.Id);
var callbackUrl=url.Action(“确认邮件”,“帐户”,新的{userId=user.Id,code=code},协议:request.url.Scheme);
userManager.sendmail(user.Id,“确认您的帐户”,“请通过单击“+System.Environment.NewLine+”)确认您的帐户);
返回true;
}
其他的
{
AddModelError(“电子邮件”,“创建用户时出错!”);
返回false;
}
}
}
在这个模型类中,我无法访问ModelState、UrlHelper、HttpRequestBase,因为它们都是controller类的一部分

我是否应该将所有这些变量传递到我的模型类中以访问它们?看起来微软写这篇文章是为了完成控制器中的所有逻辑,即使他们声明不这样做。只是不明白为什么不在控制器中这样做,不必将所有这些变量传递给模型类。

在您给出的引用中,“模型”指的是实体框架模型,即域逻辑

视图模型应该只关注显示逻辑,例如,在显示之前预处理从后端检索到的一些数据。放置
寄存器
方法的正确位置是控制器或控制器调用的某个应用程序/域服务


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

MVC与Microsoft无关-这是一个大约20年前的概念。真的

是的,模型就是那个-模型。它们中很少有逻辑发生(大部分是:无),当我看到您的视图时,我看到的代码太多了。它不是一个模型


您无法访问模型中所有这些变量的原因是您不需要它们。您不应该执行任何与在模型中显示数据无关的处理。您可以这样做。

视图是用来“查看”结果的。。。它被告知从“控制器”显示什么,控制器从模型中获取关于如何构建数据的信息

public partial class MyTable
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }   
}
就像这样

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

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...
@model IEnumerable//告诉视图要使用的模型
///这里有一些显示数据的代码。。。

如您所见,模型只是定义了数据结构。控制器在显示数据之前“控制”数据。。。视图从控制器获取成品,并按照指示显示。

Ooh,不。我喜欢将其概念化的方式是,我们有实体模型,用于与数据库通信(通过实体框架)。这些是POCO类。控制器出去获取我们的实体,我们根据具体需要填充ViewModel(例如添加发票)。然后,我们使用ViewModel调用视图,当表单发回时,我们验证并保存。看到了吗,我应该在实际的控制器POST类中执行这个逻辑吗?即使我创建了一个服务类,它也将类似于这个模型类,因为它不会是控制器的一部分,也不能访问这些变量。这就是我要做的。。。控制器方法应该只包含几行代码。如果控制器动作太胖,那么您应该考虑将逻辑移出到模型文件夹中的一个新类中。这取决于您是否经常这样做——NOSA SA。