首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Asp.Net核心Razor页面的远程验证

Asp.Net核心Razor页面的远程验证
EN

Stack Overflow用户
提问于 2019-01-14 17:11:04
回答 5查看 3K关注 0票数 4

我正在开发一个使用Razor Pages和Code First的web应用程序。

我知道,在ASP.NET MVC中,您可以使用Remote上面的一个属性,该属性指的是控制器中的一个动作,该操作可以验证数据,而不需要回发整个页面。但是它似乎在Razor页面中不起作用,因为在ASP.NET核心Razor页面中没有控制器和动作。

那么,如何在Razor页面中完成远程验证呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-01-15 06:13:39

我在我的模型类中添加了以下内容:

代码语言:javascript
运行
复制
 [Remote(action: "IsNationalIdValid",controller:"Validations")]

我在Razor项目中创建了“控制器”文件夹,并使用以下方法添加了一个控制器(ValidationsController):

代码语言:javascript
运行
复制
        public IActionResult IsNationalIdValid(string nationalId){}

但是,当我试图访问该验证应该工作的页面时,我得到了以下异常:

在asp.net核心中找不到用于远程验证的URL

由于对Asp.Net论坛中相同线程的回复,我找到了答案:我所需要做的就是在Razor项目的Startup.cs文件中添加以下代码,以便配置路由。

代码语言:javascript
运行
复制
app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

希望这个答案也能帮助到其他人。

票数 4
EN

Stack Overflow用户

发布于 2019-10-06 21:16:12

对于像我这样稍后发现并试图将属性从模型传递到验证方法的人,让方法签名看起来如下所示

代码语言:javascript
运行
复制
public IActionResult IsCharacterNameAvailable([Bind(Prefix = "Character.Name")] string name)

字符是模型,名称是属性。不添加参数之前的绑定(前缀= ""),我总是接收空值。希望这能有所帮助!

票数 6
EN

Stack Overflow用户

发布于 2019-07-24 11:59:37

RemoteAttribute派生的基类中,有一个可以被覆盖的受保护的GetUrl()方法。因此,我创建了自己的MyRemoteAttribute

代码语言:javascript
运行
复制
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>,如果验证失败,则需要返回带有trueJsonResult以通过验证、falsenull

Razor页面中的处理程序是:

代码语言:javascript
运行
复制
public IActionResult OnGetCheckUnique(string shortName)
{
    var found = db.Queryable<BusinessPartner>().Any(a => a.ShortName == shortName);
    return new JsonResult(!found);
}

这与您对RemoteAttribute所做的相同,只是在稍微修改的命名约定上例外。

我喜欢我的验证接近它的使用点,因此我把它放在同一个页面中。我还为模型类使用了一个[BindProperty],只是为了保持整洁和易于管理。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54186153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档