Как переписать действия и свойства MVC в ASP Core MVVM Razor Pages

В новом выпуске ASP CORE 2.0 в прошлом месяце они представили Razor Pages, это меня зациклило, так как старый контроллер и модель frpm MVC отсутствуют на страницах ASP CORE 2 Razor.

Насколько я понимаю из этой страницы, мы получаем привязку по умолчанию для свойства, использующие [BindProperty] attribute вне действия / метода !!!!, это потому, что он перемещен в MVVM framework, а не в MVC фреймворк.

  1. Вопрос: При попытке переписать традиционные действия, поскольку контроллеров нет, как перейти к коду в новую структуру RazorPages MVVM, т.е. и где и как привязать свойства и действия / обработчики?
  2. Поскольку свойства не в подписи, как действие / обработчик узнает, какие свойства были переданы ему со страницы просмотра / Razor?

Что такое 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");
    }
}

person Transformer    schedule 14.09.2017    source источник


Ответы (1)


Страницы 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 }";
        }
    }
}

Вы по-прежнему можете иметь модели и инициализировать их в файле кода программной части. Но если вам нужны контроллеры, я бы посоветовал вам не использовать страницы razor, а просто использовать классический mvc. Вы можете создать с ним новый проект, только не выбирайте бритвенные страницы из шаблона. Вам, конечно, не нужно создавать проект razor Pages. Это просто вариант. Я лично не использую его, так как я думаю, что он склонен к повторению кода, поскольку каждый файл кода программной части действителен только для одной страницы afaik.

Что такое PageModel?

Модель страницы - это просто файл кода программной части, который выполняет логику на стороне сервера для вашей конкретной страницы.

Я не совсем уверен, что вы просите, вы привязываете модели, как и любые другие страницы бритвы и свойства в классе кода программной части. В моем примере модель - это файл кода программной части.

как действие / обработчик узнает, какие свойства были переданы ему со страницы View / Razor?

Обработчик действия знает об этом, указав его на странице razor: <input asp-for="Customer.Name" />

Подробнее о Razor Pages читайте здесь: https://docs.microsoft.com/en-us/aspnet/core/mvc/razor-pages/?tabs=visual-studio

person Ms01    schedule 14.09.2017
comment
спасибо за ответ, интересно куда деваются действия? особенно для отправки формы / вызовов Ajax ... все кажется привязанным к обработчику OnPOST ... нужно ли мне создавать свой собственный маршрутизатор ... похоже на шаг назад. Не знаете, зачем мне переходить на эту или когда стоит рассмотреть эту модель - person Transformer; 14.09.2017
comment
@transformer Что ж, каждое действие сервера, вероятно, лучше всего разместить в каждой модели страниц. Поскольку каждая страница имеет свою собственную логику, вы не можете повторно использовать логику простым способом, как с контроллером. Я думаю, вам следует использовать razorpages для проектов, которые, возможно, ранее использовали классические формы asp и / или для небольших проектов, где вам не нужна общая логика между страницами. Конечно, вы все равно можете создать несколько классов обслуживания и использовать их так же. Но я бы посоветовал использовать классический MVC, а не razorpages, если вы не уверены, почему выбрали razorpages. - person Ms01; 18.09.2017
comment
Но если вам нужны контроллеры, я бы посоветовал вам не использовать Razor Pages - вы можете использовать контроллеры вместе с Razor Pages. Я делаю это, если мне нужны URI в стиле API, которые не обязательно относятся к определенной странице. Вы даже можете смешивать представления MVC с Razor Pages, если действительно хотите. Единственное отношение Razor Pages к веб-формам заключается в том, что они оба являются MVVM, у них нет другого багажа веб-форм (например, состояния просмотра, жизненного цикла страницы, элементов управления asp, ограничения одной формы и т. Д.). - person McGuireV10; 15.01.2018