我正在开发一个使用Razor Pages和Code First的web应用程序。
我知道,在ASP.NET MVC中,您可以使用Remote上面的一个属性,该属性指的是控制器中的一个动作,该操作可以验证数据,而不需要回发整个页面。但是它似乎在Razor页面中不起作用,因为在ASP.NET核心Razor页面中没有控制器和动作。
那么,如何在Razor页面中完成远程验证呢?
发布于 2019-01-15 06:13:39
我在我的模型类中添加了以下内容:
 [Remote(action: "IsNationalIdValid",controller:"Validations")]我在Razor项目中创建了“控制器”文件夹,并使用以下方法添加了一个控制器(ValidationsController):
        public IActionResult IsNationalIdValid(string nationalId){}但是,当我试图访问该验证应该工作的页面时,我得到了以下异常:
在asp.net核心中找不到用于远程验证的URL
由于对Asp.Net论坛中相同线程的回复,我找到了答案:我所需要做的就是在Razor项目的Startup.cs文件中添加以下代码,以便配置路由。
app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });希望这个答案也能帮助到其他人。
发布于 2019-10-06 21:16:12
对于像我这样稍后发现并试图将属性从模型传递到验证方法的人,让方法签名看起来如下所示
public IActionResult IsCharacterNameAvailable([Bind(Prefix = "Character.Name")] string name)字符是模型,名称是属性。不添加参数之前的绑定(前缀= ""),我总是接收空值。希望这能有所帮助!
发布于 2019-07-24 11:59:37
在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>,如果验证失败,则需要返回带有true的JsonResult以通过验证、false或null。
Razor页面中的处理程序是:
public IActionResult OnGetCheckUnique(string shortName)
{
    var found = db.Queryable<BusinessPartner>().Any(a => a.ShortName == shortName);
    return new JsonResult(!found);
}这与您对RemoteAttribute所做的相同,只是在稍微修改的命名约定上例外。
我喜欢我的验证接近它的使用点,因此我把它放在同一个页面中。我还为模型类使用了一个[BindProperty],只是为了保持整洁和易于管理。
https://stackoverflow.com/questions/54186153
复制相似问题