Удаленная проверка в основных страницах Asp.Net - PullRequest
0 голосов
/ 14 января 2019

Я занимаюсь разработкой веб-приложения с использованием Razor Pages и Code First.

Я знаю, что в ASP.NET MVC вы можете использовать Remote над свойством, относящимся к действию в контроллере, которое проверяет данные без отправки всей страницы назад. Но, похоже, он не работает в Razor Pages, так как в ASP.NET Core Razor Pages нет контроллера и действия.

Итак, как мне выполнить удаленную проверку в Razor Pages?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Я добавил следующее в свой модельный класс:

 [Remote(action: "IsNationalIdValid",controller:"Validations")]

Я создал папку 'Controllers' в моем проекте Razor Pages и добавил контроллер (ValidationsController) следующим способом:

        public IActionResult IsNationalIdValid(string nationalId){}

Однако, когда я попытался перейти на страницу, где эта проверка должна была работать, я получил следующее исключение:

Не удалось найти URL для удаленной проверки в ядре asp.net

Благодаря ответу на ту же тему на форуме Asp.Net я разобрался с ответом: Все, что мне нужно было сделать, это добавить следующий код в файл Startup.cs моего проекта Razor Pages для настройки маршрута.

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

Надеюсь, этот ответ поможет кому-то еще.

0 голосов
/ 24 июля 2019

В базовом классе, который RemoteAttribute является производным, есть защищенный метод GetUrl(), который можно переопределить. Поэтому я создал свой собственный MyRemoteAttribute класс

public class MyRemoteAttribute : RemoteAttribute
{
    /// <summary>
    /// Initialise an instance of the <see cref="MyRemoteAttribute"/>
    /// </summary>
    /// <param name="handler">The name of the Razor Page Handler</param>
    /// <param name="page">The Razor Page name</param>
    public MyRemoteAttribute(string handler = null, string page = null)
    {
        Handler = handler;
        Page = page;
    }

    /// <summary>
    /// Gets/sets the url to use for remote validation
    /// </summary>
    public string Url { get; set; }
    public string Page { get; private set; }
    public string Handler { get; private set; }

    protected override string GetUrl(ClientModelValidationContext context)
    {
        // Use an URL is specified
        if (!string.IsNullOrEmpty(Url)) return Url;

        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }
        if (string.IsNullOrEmpty(Handler))
        {
            throw new InvalidOperationException("No Handler specified");
        }

        var services = context.ActionContext.HttpContext.RequestServices;
        var factory = services.GetRequiredService<Microsoft.AspNetCore.Mvc.Routing.IUrlHelperFactory>();
        var urlHelper = factory.GetUrlHelper(context.ActionContext);

        var page = Page?? context.ActionContext.RouteData.Values["page"] as string;

        Url = urlHelper.Page(page, Handler);
        if (Url == null)
        {
            throw new InvalidOperationException();
        }

        return Url;
    }
}

В моем приложении, которое использует области, создает URL /BusinessPartners/Clients/Create?handler=CheckUnique

Для использования украсьте свойство вашей модели с помощью [MyRemote(Url="/Something/Somecheck")], чтобы использовать указанный URL, или [MyRemote("CheckUnique")], чтобы указать обработчик страницы Razor. Обработчик должен иметь имя OnGet<handlername> и должен возвращать JsonResult с true для прохождения проверки, false или null, если проверка не пройдена.

Обработчик на странице Razor:

public IActionResult OnGetCheckUnique(string shortName)
{
    var found = db.Queryable<BusinessPartner>().Any(a => a.ShortName == shortName);
    return new JsonResult(!found);
}

Это то же самое, что вы сделали бы для RemoteAttribute, за исключением слегка измененного соглашения об именах.

Мне нравится, что моя валидация близка к той точке, где она используется, поэтому я поместил ее на той же странице. Я также использовал один [BindProperty] для модельного класса, чтобы все было аккуратно и легко.

0 голосов
/ 14 января 2019

Похоже, что есть запрос функции для удаленной проверки в ASP.NET Core Razor Pages, но это не приоритет:

https://github.com/aspnet/Mvc/issues/8245

...