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