【问题标题】:Fail using Remote Validation, MVC, and Razor Pages .NET Core 2.2 ::: "InvalidOperationException: No URL for remote validation could be found"使用远程验证、MVC 和 Razor Pages .NET Core 2.2 ::: "InvalidOperationException: 找不到远程验证的 URL" 失败
【发布时间】:2020-12-12 15:07:31
【问题描述】:

目标:使用 Razor Pages .NET Core 2.2 和 MVC 创建新帐户时,仔细检查用户名是否存在。

错误:InvalidOperationException:找不到远程验证的 URL。

我查看了其他 StackOverflow 线程,但目前没有任何解决方案。

用户名输入的我的数据注释:

[Microsoft.AspNetCore.Mvc.Remote("IsUserNameUsed", "ValidationsController", ErrorMessage = "Username is taken.")]
public string UserName { get; set; }

我在 Controller ValidationsController 中的代码:

  public IActionResult IsUserNameUsed([Bind(Prefix = "Accounts.UserName")] string username)
        { 
            string query = "SELECT UserName FROM Accounts WHERE UserName={0}";
            var found = _context.Accounts
            .FromSql(query, username)
            .FirstOrDefault();

            if (found.Equals(username))
            {
                return Json(true);
            }
            else
            { 
            return Json(false);
            }
        }

我在尝试导航到有问题的 Razor 页面时收到此错误。

InvalidOperationException: No URL for remote validation could be found.
 <input asp-for="Accounts.UserName" class="form-control" />

我发现提到将 MVC 路由添加到严格的 Razor Pages 应用程序。我添加了下面的代码,但无论我添加什么,我都会收到错误。

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

我使用实际的控制器名称尝试了不同的路由值,这是任务:

routes.MapRoute(
    name: "default",
    template: "{controller=Validations}/{action=IsUserNameUsed}/{username?}");

再试一次(没有“?”):

  name: "default",
    template: "{controller=Validations}/{action=IsUserNameUsed}/{username}");

又是另一个(没有用户名):

name: "default",
template: "{controller=Validations}/{action=IsUserNameUsed}");

我知道如果它是一条蛇,它会咬我,但我完全傻眼了。

我仍然收到“InvalidOperationException:找不到远程验证的 URL。”

【问题讨论】:

  • “ValidationsController”->“验证”docs.microsoft.com/en-us/aspnet/core/mvc/models/…
  • 谢谢 mjwills。我有那个部分。我通过跟踪和错误找到了答案,并在不同的谷歌搜索和 ASP.NET 论坛和 www.LearnRazorPages.com 中寻找答案。
  • 见下文。我花了这么长时间来填写它。很多不同的部分。必须在 Razor 页面的 Startup.cs 中输入默认 MVC 路由,才能使用模型数据注释中引用的自定义路由。大量的试验和错误。此外,该字段必须绑定到控制器上进入 JsonResult 的位置,否则它只会在设置断点时显示 null。

标签: c# asp.net-mvc razor routes data-annotations


【解决方案1】:

这是我的 Accounts.cs 模型中用户名的数据注释:

   [Required]
    [Remote("IsUserNameUsed", "Validations",ErrorMessage ="UserName already exists" ,HttpMethod ="post")]
    public string UserName { get; set; }

这是 .cshtml Razor 页面上的用户名输入:

<div class="form-group">
    <label asp-for="Accounts.UserName" class="control-label"></label>
    <input asp-for="Accounts.UserName" class="form-control" />
    <span asp-validation-for="Accounts.UserName" class="text-danger"></span>
</div>

这是控制器(ValidationsController)中的Action(JsonResult)。 注意括号内的 Binding of UserName 字段。如果没有此语法,则返回 null。并且必须在 Controller/Json 中设置,而不是在模型中设置 -- [Bind(Prefix = "Accounts.UserName")] string NameEntered :

public JsonResult IsUserNameUsed([Bind(Prefix = "Accounts.UserName")] string NameEntered)
{
    bool UserNameExists = _context.Accounts.Any(u => u.UserName.Equals(NameEntered));

    return new JsonResult(!UserNameExists);  //NOTICE OPPOSITE BOOLEAN
}

还要注意上面我是如何用一行来确定数据库表的存在并只用另一行返回 JsonResult 的。这是一种负面的二进制开关,您必须对其进行测试才能使其正确,因为 true(found) 确实意味着 false(无法使用)。

现在,这就是我不断收到错误消息的地方,说我的路线错误。

“InvalidOperationException:找不到远程验证的 URL”

所以我尝试在模型中引用一个名为 JsonResult("IsUserNameUsed") 的自定义名称和一个自定义名称 Controller("Validations") 并在模型中给出该路径:

[Remote("IsUserNameUsed", "Validations",ErrorMessage ="UserName already exists" ,HttpMethod ="post")]

我不知道,但我正在做某事。 . .但 。 . . . . 由于它是 Razor Pages .NET Core 2.2 应用程序,我仍然必须在控制器顶部创建一个“使用 Microsoft.AspNetCore.Mvc”,并将其放在配置部分的 Startup.cs 文件中。

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

请注意,上面的路由是 MVC 应用程序附带的默认路由(网站打开到索引页面)。有趣的是它是如何使用“id”的?即使我正在验证一个字符串。我排除了我添加的 HomeController,认为如果它不存在它会触发错误。但。 . .没有错误。 . .只需要在 Startup.cs 中使用默认的 MVC 路由模板和一个自定义命名控制器和 2 个不同的路由。

但是,这 2 条路由使我的自定义控制器 JsonResult URL 来自模型的数据注释。清如泥?使用MVC自定义路由需要的默认路由,去图吧。

现在你知道故事的其余部分了。

警告: 我使用的是 2.2,但如果你有 3.0,现在有一个“RemotePage”数据注释并且不需要 MVC。你可以在https://www.learnrazorpages.com/找到这个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多