使用远程验证,MVC和Razor页面失败。NETCore 2.2 :::“ InvalidOperationException:找不到用于远程验证的URL”

时间:2020-08-24 00:07:53

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

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

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

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

我的UserName输入数据注释:

[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);
            }
        }

当我尝试导航到有问题的剃刀页面时出现此错误。

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?}");
});

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

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。”

1 个答案:

答案 0 :(得分:1)

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

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

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

<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)中的动作(JsonResult)。 请注意在括号内的“用户名绑定”字段。如果不使用此语法,则返回null。并且必须在Controller / Json中设置,而不是在模型中设置- [Bind(Prefix =“ Accounts.UserName”)]字符串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应用程序,因此我仍然必须在Controller顶部创建一个“ using Microsoft.AspNetCore.Mvc”,并将其放在Configure部分的Startup.cs文件中。

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

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

但是,这2条路由使我的自定义Controller JsonResult URL能够从Model的Data Annotation起作用。像泥一样清澈?使用MVC自定义路由所需的默认路由,请参见图。

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

注意事项: 我使用的是2.2,但是如果您使用的是3.0,则现在有一个“ RemotePage”数据注释,并且不需要MVC。您可以在https://www.learnrazorpages.com/

上找到它
相关问题