如何将 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
框架。
- 问题:在尝试重写传统操作时,由于没有控制器,如何将代码移动到新的 RazorPages MVVM 框架,即 以及在何处以及如何绑定属性,以及actions/handlers?
- 由于签名中的属性 不是 ,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
在上个月 ASP CORE 2.0 的新版本中,他们引入了 Razor Pages,这让我陷入了困境,因为 ASP CORE 2 中缺少旧控制器和模型 frpm MVC剃刀页面。
我对这个 page 的理解是,我们使用 Action/Method 之外的 [BindProperty] attribute
获得属性的默认绑定!!!!,这是因为它移到了 MVVM framework
相对于 MVC
框架。
- 问题:在尝试重写传统操作时,由于没有控制器,如何将代码移动到新的 RazorPages MVVM 框架,即 以及在何处以及如何绑定属性,以及actions/handlers?
- 由于签名中的属性 不是 ,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