如何将 MVC 操作和属性重写为 ASP 核心 MVVM Razor 页面

How to rewrite MVC Actions & properties to ASP Core MVVM Razor Pages

在上个月 ASP CORE 2.0 的新版本中,他们引入了 Razor Pages,这让我陷入了困境,因为 ASP CORE 2 中缺少旧控制器和模型 frpm MVC剃刀页面。

我对这个 page 的理解是,我们使用 Action/Method 之外的 [BindProperty] attribute 获得属性的默认绑定!!!!,这是因为它移到了 MVVM framework 相对于 MVC 框架。

  1. 问题:在尝试重写传统操作时,由于没有控制器,如何将代码移动到新的 RazorPages MVVM 框架,即 以及在何处以及如何绑定属性,以及actions/handlers?
  2. 由于签名中的属性 不是 action/handler 如何知道哪些属性是从 View/Razor 页?

什么是页面模型?

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");
    }
}

Razor 页面根据我的理解几乎可以替代旧的 asp.net 表单,您只需拥有一个包含逻辑的页面。有点像 php 做事的方式。

如果您创建一个页面,假设 Pages/Index2.cshtml 您还应该创建(或者可能在 Visual Studio 中为您创建)一个名为 Pages/Index2.cshtml.cs 的 "code-behind" 文件例如。

// 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 }";
        }
    }
}

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

What is the PageModel?

页面模型只是为特定页面执行服务器端逻辑的代码隐藏文件。

我不确定您的确切要求,您可以像绑定代码隐藏中的任何其他 razor 页面和属性一样绑定模型 class。该模型是我示例中的代码隐藏文件。

how does the action/handler know which properties were passed to it from the View/Razor Page?

操作处理程序通过您在 razor 页面中指定它来了解它: <input asp-for="Customer.Name" />

请在此处阅读有关 Razor Pages 的更多信息: https://docs.microsoft.com/en-us/aspnet/core/mvc/razor-pages/?tabs=visual-studio