在Model中写什么,在View Model中写什么以及在Controller中写什么

时间:2014-09-30 05:18:47

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

我必须启动一个业务应用程序项目。我打算使用MVC5,实体框架数据库第一种方法。

我的问题是我们必须编写以下逻辑吗?

验证逻辑(数据注释/远程验证/自定义验证等) - > Model?,ViewModel?或控制器?

业务逻辑(CURD操作,自定义验证功能/方法,下拉列表/网格填充等功能) - > Model?,ViewModel?或控制器?

注意: - EntityFrameWork生成的类在数据库第一种方法中无法编辑,在远程验证属性中,我们必须指定控制器中存在的方法名称

4 个答案:

答案 0 :(得分:1)

验证逻辑 - 属于模型,数据注释应用于此目的 - http://msdn.microsoft.com/en-us/library/ee256141(VS.100).aspx。最好将验证逻辑放在模型中的原因是它允许您使用验证逻辑来​​定位所有实例。例如。如果你有5个使用特定模型的Controller动作,你只需要更新模型中的验证逻辑(而不是5个单独的动作方法)。

http://www.pluralsight.com/training/player?author=scott-allen&name=mvc4-building-m5-data-ii&mode=live&clip=6&course=mvc4-building

然而,回到你的陈述:

  

注意: - EntityFrameWork生成的类无法在其中进行编辑   数据库第一种方法,在远程验证属性中我们必须   指定控制器中存在的方法名称

我可以看到您来自哪里,因为只要EntityFramework / T4模板重新生成生成的类,您的数据注释就会被删除。

假设这是你的意思,我建议你看看这里描述的EF MetaData类(参见添加元数据类标题): http://www.asp.net/mvc/tutorials/mvc-5/database-first-development/enhancing-data-validation

这些有助于通过将每个字段的DataAnnotations与Model分开来解决此特定情况。

我可以看到将验证DataAnnotations添加到ViewModels的情况。

E.g。如果你想拥有一个包含5个字段的Model,但只允许其中3个绑定到Controller,你可以创建一个只包含要绑定的字段的ViewModel(例如,以避免' Overposting' /& #39; Mass Assignment')然后设置适当的DataAnnotation属性。缺点是您可以在多个位置指定验证逻辑,因此请考虑尽可能使用 [Bind(Exclude =" field1,field2")] 属性 - 见http://www.pluralsight.com/training/player?author=scott-allen&name=mvc4-building-m5-data-ii&mode=live&clip=5&course=mvc4-building

业务逻辑 - CRUD操作绝对属于Controller。您甚至可能希望将CRUD操作方法分离到单独的存储库层,如下所述:http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

在获取编辑器数据(下拉列表等)方面:如果您计划重复使用控件,请考虑编写编辑器模板,如下所述:http://www.codeproject.com/Articles/672591/Exploring-Display-and-Editor-Templates-in-ASP-NET

编辑:这是创建自定义' HoursOfTheDay'编辑模板并通过[UIHint("HoursOfTheDay")] DataAnnotation - http://www.devcurry.com/2013/04/custom-templates-in-aspnet-mvc.html

使用此模板

否则,我可能会将此数据(例如您的选项列表)从Controller加载到ViewModel或Model中。

自定义验证属于模型或模型MetaData类中的自定义验证DataAnnotation,如下所述:http://www.pluralsight.com/training/player?author=scott-allen&name=mvc4-building-m5-data-ii&mode=live&clip=7&course=mvc4-building

希望能回答你的问题。

顺便说一句,整个Pluralsight课程非常好(也是免费的):http://www.pluralsight.com/courses/mvc4-building

答案 1 :(得分:0)

在模型中你必须编写你的类。 在视图中,您必须编写您的设计。 在控制器中,您必须编写逻辑编码。

在MVC视图中,您可以编写内联编码。所以你也可以在视图中编写你的代码。 有两种类型的视图,我更喜欢Razor视图。

示例:

在模型中(名称:mymodel):

               public class mymodel
               {
               public string myname {get; set;}
               }

在视图中(名称:firstproj):

              @model myproject.mymodel
              <html>
              <div>@Model.myname</div>
               </html>

在Controller(名称:Homecontroller)中:

              public ActionResult firstproj(mymodel m)
              {
              m.myname="Sukesh Chand";
              return view(m)
              }

答案 2 :(得分:0)

您应该遵循基本的MVC架构。您可以在视图模型中编写验证逻辑而不是在数据模型中。您可以在Controller中编写业务逻辑或使用控制器本身的引用。不要做复杂的架构。首先,你要正确理解你的需要,然后根据它进行设计。

答案 3 :(得分:-1)

我想你的所有逻辑都应该在模型中。视图应该只处理如何显示信息,无论信息是什么。控制器将视图链接到模型,并将信息从模型传递到视图。它还可以在需要更改显示的信息时随时处理。

我希望这会有所帮助。

修改

在MVVM中,实际视图直接连接到控制器。 ViewModel由模型更新,然后更新控制器。这些图像比较MVVM和MVC:

MVVM:

MVVM

MVC:

MVC

Theres是一个完整的article,它描述了MVVM,但是在Objective-C上下文中。如果您需要进一步的帮助,请参阅它。