MVC vs Razor Pages - 快速比较

2018-05-21

我试图学习 ASP.NET,但我真的很困惑. 所有的教程似乎相互冲突,我是否应该使用MVC或Razor Pages?

    如果你在这个勇敢的.NET Core世界里学习ASP.NET ,并且想要构建服务器端的Web应用程序,那么这是两个竞争者之间的直接斗争。

   要清楚的是,通过坚持"服务器端",我们故意忽略另一个选项:构建 Web API,以便为前端框架比如Angular服务。  

    在蓝色的角落里,我们有MVC,在红色这边的角落里,则有孩子, Razor Pages。

    事实上,他们有很多相同的基本框架,但也有一些关键的差异。

    在您决定下一个项目采用哪一个项目之前,值得花点时间直接比较它们。

MVC


    自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

    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尚处于初期阶段,几乎可以肯定,在接下来的几个发行版中,它们会有所改进。

    就是说,它们似乎是一个有希望的开端,并且(如该比较所示)具有将与特定请求相关的所有内容包含在您的应用程序中的好处(而不是像拼图一样散布在您的应用程序周围) 然后您必须放回原处)。



联系信息

QQ:1827566828
Email: 1827566828@qq.com
Web: https://www.yynet.wang

留言