2018-05-21
我试图学习 ASP.NET,但我真的很困惑. 所有的教程似乎相互冲突,我是否应该使用MVC或Razor Pages?
如果你在这个勇敢的.NET Core世界里学习ASP.NET ,并且想要构建服务器端的Web应用程序,那么这是两个竞争者之间的直接斗争。
要清楚的是,通过坚持"服务器端",我们故意忽略另一个选项:构建 Web API,以便为前端框架比如Angular服务。
在蓝色的角落里,我们有MVC,在红色这边的角落里,则有孩子, Razor Pages。
事实上,他们有很多相同的基本框架,但也有一些关键的差异。
在您决定下一个项目采用哪一个项目之前,值得花点时间直接比较它们。
自2009年第一个版本发布以来一直存在的古老存在。
以下是ASP.NET Core如何处理MVC请求的粗略概述。
路由引擎是ASP.NET Core决定如何处理您的请求的关键。
可以将其配置为将任何请求路由到任何控制器操作。
默认路由配置使用控制器名称和操作名称的组合。
/<控制器名称>/<操作名称>
因此,对/staff /index的请求将路由到StaffController上名为Index的操作。
public class StaffController : Controller{ [HttpGet] public IActionResult Index() { return View(); } }
一旦请求到达控制器动作,动作中的逻辑就会执行并返回响应。
在MVC中, 你的应用代码存在于控制器操作中。
public class StaffController : Controller{ [HttpGet] public IActionResult Index() { // logic here... // calls to services etc. return View(); } }
在这里,您将要验证请求,执行任何业务逻辑,调用应用程序的服务等,然后最终返回响应。
您可以使用属性来指示您的操作将接受哪种类型的请求,例如GET,POST,PUT(或任何其他HTTP动词)。
MVC 动作不需要返回一个视图,但通常会返回一个。
在这些视图中,您将放置所有HTML标记。
返回视图时,MVC需要定位该视图,并使用一些默认约定来实现此目的。
除非另有说明,否则它将在“视图”文件夹中查找与控制器同名的文件夹,然后在视图中查找与“动作”同名的视图。
例如 ViewsStaffIndex.cshtml
这里要注意的关键是MVC请求将路由到控制器操作,由操作决定是否返回视图(如果返回,则返回哪个视图)。
MVC操作可以轻松覆盖默认约定并返回特定视图(其名称与操作的名称不同)。
public class StaffController : Controller{ [HttpGet] public IActionResult Index() { // logic here... return View("AnotherPage"); } }
此示例将导致MVC在ViewsStaff文件夹中查找名为AnotherPage.cshtml的视图。
您可以创建一个ViewModel。 这是一个位于.cs文件中的类,该类具有要在视图上显示的数据的属性。
public class StaffProfile{
public string FirstName { get; set; } public string LastName { get; set; } }
您的控制器操作可以将这些数据与您的视图一起返回。
public class StaffController : Controller{ public IActionResult Index() { // would come from a database or something in real life var model = new StaffProfile { FirstName = "Jon", LastName = "Hilton" }; return base.View(model); } }
然后,您的视图可以呈现此数据。
@model StaffProfile<h1>Welcome</h1><p>Hey @Model.FirstName!</p>
通常,MVC应用程序具有基于文件夹的标准约定,其中包含用于控制器,视图和视图模型的单独文件夹。
Razor Pages 在 ASP.NET Core中是全新的。
使用Razor Pages, 当您发出请求(例如/contact)时,默认的ASP.NET路由配置将尝试在Pages文件夹中找到该请求的Razor Page。
它只是查找具有请求中使用的名称的页面(用于/contact的请求,即Contact.cshtml),并直接路由到该页面。
然后,Razor Page就好像是控制器动作一样。
为了使.cshtml文件具有Razor Page的资格,该文件必须位于Pages文件夹中(使用默认约定),并在其标记中包含@page。
每个Razor页面都可以有一个对应的页面模型。
如果我们遵循默认约定,ASP.NET将期望该模型与相应的Razor页面具有相同的名称,但附加一个.cs。
使用Razor Pages,您的应用程序代码将驻留在这些模型中,尤其是在用于不同HTTP动词的方法(例如GET,POST)中。
public class ContactModel : PageModel{ public void OnGet() { // logic here... // calls to services etc. } public void OnPost() { } }
好吧,这很简单。
由于该请求已直接路由到可以处理该请求的特定razor page,因此无需定位视图,该视图即是请求已路由至的视图。 Contact.cshtml。
Razor Pages的默认路由非常简单,并且尊重子文件夹,因此可以通过对/staff/profile的请求来访问PagesStaffProfile.cshtml。
值得注意的是,您可以省略索引,因为它是默认页面。 在此示例中,/staff/和/staff/index均会将您带到PagesStaffIndex.cshtml。
无需拥有单独的ViewModel,您只需向页面模型添加属性即可。
public class ProfileModel : PageModel{ public string FirstName { get; set; } public string LastName { get; set; } public void OnGet() { // would come from a database or something in real life FirstName = "Jon"; LastName = "Hilton"; } }
您可以通过页面模型方法(例如OnGet)直接设置这些属性。
然后,很容易在Page本身中呈现这些数据。
@page @model ProfileModel<h1>Welcome</h1><p>Hey @Model.FirstName!</p>
所有内容都保存在Pages文件夹中(默认情况下)。
每个Razor页面均由“视图”模板(.cshtml)和一个相应的.cs文件组成,该文件有效地充当控制器操作,特别是针对该视图。
所以你有了这个。
对MVC和Razor Pages的快速比较。
有趣的是,Microsoft现在提倡使用ASP.NET Core构建服务器端应用程序时,Razor Pages是首选。
需要注意的是,Razor Pages尚处于初期阶段,几乎可以肯定,在接下来的几个发行版中,它们会有所改进。
就是说,它们似乎是一个有希望的开端,并且(如该比较所示)具有将与特定请求相关的所有内容包含在您的应用程序中的好处(而不是像拼图一样散布在您的应用程序周围) 然后您必须放回原处)。