2

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

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

  1. 问题:在尝试重写传统动作时,由于没有控制器,如何将代码移至新的 RazorPages MVVM 框架,即在何处以及如何绑定属性和动作/处理程序?
  2. 由于属性不在签名中,动作/处理程序如何知道哪些属性是从视图/剃刀页面传递给它的?

什么是页面模型?

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

1 回答 1

2

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

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

// 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。您可以使用它创建一个新项目,只是不要从模板中选择剃须刀页面。您当然不需要创建 razor pages 项目。这只是一种选择。我个人并没有真正使用它,因为我认为很容易重复代码,因为每个代码隐藏文件仅对一页 afaik 有效。

什么是页面模型?

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

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

动作/处理程序如何知道哪些属性是从视图/剃刀页面传递给它的?

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

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

于 2017-09-14T11:47:53.640 回答