簡體   English   中英

使用遠程驗證、MVC 和 Razor Pages .NET Core 2.2 失敗 :::“InvalidOperationException: 找不到遠程驗證的 URL”

[英]Fail using Remote Validation, MVC, and Razor Pages .NET Core 2.2 ::: “InvalidOperationException: No URL for remote validation could be found”

目標:使用 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”。

這是我的 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)。 注意括號內的 UserName 字段的綁定。 如果沒有此語法,則返回 null。 並且必須在控制器/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 應用程序,我仍然必須在控制器頂部創建一個“使用 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/上找到它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM