1

上个月在新版本的ASP CORE 2.0中,他们介绍了Razor Pages,这让我在一个循环中,因为旧的控制器&模型frpm MVC从ASP CORE 2 Razor页面。如何重写MVC操作和属性到ASP核心MVVM Razor页面

我从这个page的理解是,我们得到使用[BindProperty] attribute外的动作/法属性的默认绑定!!!!,这是因为它移动到MVVM framework,而不是MVC框架。

  1. 问:在试图改写了传统的行动,因为没有控制器,如何移动到代码到新RazorPages MVVM框架,即哪里以及如何将属性绑定和行动/处理器?
  2. 由于属性是而不是在签名中,动作/处理程序如何知道从View/Razor Page传递给它的属性?

什么是PageModel?

public class CreateModel : PageModel // what is this pagemodel, is it new or the same old model? 
{ 
    private readonly AppDbContext _db; 

    public CreateModel(AppDbContext db) 
    { 
     _db = db; 
    } 

    [BindProperty] 
    public Customer Customer { get; set; } // why is the property outside? 

    public async Task<IActionResult> OnPostAsync() 
    { 
     if (!ModelState.IsValid) 
     { 
      return Page(); 
     } 

     _db.Customers.Add(Customer); 
     await _db.SaveChangesAsync(); 
     return RedirectToPage("/Index"); 
    } 
} 

回答

2

剃刀页是从我的理解几乎替代旧的asp.net形式,你只是有一个页面的逻辑。有点像PHP如何做事情。

如果您创建一个页面,比如说Pages/Index2.cshtml,您还应该创建一个名为Pages/Index2.cshtml.cs的“代码隐藏”文件(或者可能会在Visual Studio中为您创建)。

// The page file 

@page 
@using RazorPages 
@model IndexModel2 

<h2>Separate page model</h2> 
<p> 
    @Model.Message 
</p> 


// The code-behind file 

using Microsoft.AspNetCore.Mvc.RazorPages; 
using System; 

namespace RazorPages 
{ 
    public class IndexModel2 : PageModel 
    { 
     public string Message { get; private set; } = "PageModel in C#"; 

     public void OnGet() 
     { 
      Message += $" Server time is { DateTime.Now }"; 
     } 
    } 
} 

您仍然可以使用模型并在代码隐藏文件中初始化它们。但是如果你想要控制器,我会建议你不要使用剃须刀页面,只使用经典的mvc。您可以使用它创建一个新项目,只是不要从模板中选择剃须刀页面。 你当然不需要创建一个剃须刀页面项目。这只是一个选项。我个人并没有真正使用它,因为我认为很容易重复代码,因为每个代码隐藏文件只对一个页面afaik有效。

什么是PageModel?

pagemodel是简单的代码隐藏文件,为您的特定页面执行服务器端逻辑。

我不确定你在问什么,你绑定模型就像任何其他剃须刀页面和代码隐藏类中的属性。该模型是我的示例中的代码隐藏文件。

动作/处理程序如何知道从View/Razor Page传递给它的属性?

操作处理程序由你知道它在剃刀页确定它: <input asp-for="Customer.Name" />

请阅读更多有关剃刀这里的内容: https://docs.microsoft.com/en-us/aspnet/core/mvc/razor-pages/?tabs=visual-studio

+0

感谢您的答复,我想知道你在哪里的行动去了吗?特别是对于表单submits/Ajax调用......一切似乎都与OnPOST处理程序绑定在一起......我是否需要构建自己的自定义路由器......看起来像是倒退了一步。想知道为什么我应该采取这种行动,或者应该在何时考虑这个模型 – transformer

+0

@transformer那么,每个服务器动作可能最好放置在每个页面模型中。由于每个页面都有自己的逻辑,因此不能像使用控制器那样以简单的方式重新使用逻辑。 我认为你应该使用可能以前使用经典的asp窗体和/或小型项目的项目,而不需要在页面之间共享逻辑。当然,你仍然可以创建一些服务类并使用它。但是如果你不确定为什么选择razorpages,我会说经典的MVC,而不是razorpages。 – Ms01

+1

“但是如果你想要控制器,我建议你不要使用剃须刀页面” - 你可以使用控制器和Razor Pages一起使用。我这样做,如果我想要API风格的URI不一定与特定页面相关。如果你真的想要,你甚至可以将MVC视图与Razor Pages混合使用。 Razor Pages与Web Forms的唯一关系是它们都是MVVM,它们没有任何其他Web窗体行李(比如viewstate,页面生命周期,asp控件,单个表单限制等)。 – McGuireV10