簡體   English   中英

如何在 GET 方法中驗證查詢字符串參數

[英]How to validate query string parameters in GET method

我構建了一個 ASP.NET Core MVC 應用程序,並且使用了默認的 MVC URL 路由:

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

我想創建用於創建和編輯用戶的GET方法。

要創建新用戶,我需要轉到 url /Admin/User並編輯現有用戶 url /Admin/User/{id:int}

我試圖創建這樣的方法:

[HttpGet]
public async Task<IActionResult> User(int? id)
{
}

如何限制 id 參數的類型?

我只需要允許訪問/Admin/User/Admin/User/{id:int} - 但如果我嘗試即 - /Admin/User/ABCD - (使用字符串作為 ID) - 它也是允許的。

如果參數 ID 將是另一種類型而不是數字,那么我想返回404

最簡單的選擇是使用此約束創建路由。 請注意,如果您像這樣在路由中設置必需參數,則沒有理由將id可空。

[HttpGet("Admin/User")]
public async Task<IActionResult> Add()
{
}

[HttpGet("Admin/User/{id:int}")]
public async Task<IActionResult> Edit(int id) 
{
}

或者保留名為User的操作方法並使用:

app.UseMvc(routes =>
{
    routes.MapRoute("AdminUser", "Admin/User/{id:int}");
    routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

請注意,基於約定的方法不區分 GET/POST。

或者,如果您想將所有 ID 參數設置為int ,您可以像這樣為整個站點配置路由:

routes.MapRoute(
    name: "defaultWithId",
    template: "{controller}/{action}/{id:int}");
routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}");

參考: ASP.NET Core 中的路由

您必須為此編寫自定義模型綁定器,或者為返回 404 的所有其他類型創建重載。我只想重新考慮您的設計,並使用不同的 /Admin/CreateUser 操作來創建新用戶,而不允許沒有 ID 的用戶呼叫。

可以使用單一方法實現。

如果您使用數字 ID,則現有用戶 ID 將大於零。 對於新用戶 Id 將為零或小於零。

如果您使用字符串 id,那么對於現有用戶,id 將是非空字符串。 例如ABCD。 對於新用戶 ID 將為空。

基於此邏輯,您可以發送適當的響應或 404 響應。 如果您使用的是字符串 ID,則更改 Get 方法的數據類型。 而不是使用可為空的 int 使用字符串。

以下代碼可能會有所幫助

[HttpGet("{id}")]
    public async Task<IActionResult> User(string id)
    {
        if (string.IsNullOrWhiteSpace(id))
        {
            //Replace NewUser view name by Appropriate View name in your project
            return View("NewUser");
        }
        else
        {
           var isValidUser= IsValidUser(id);
            if(isValidUser)
            {
                //Replace ExistingUser view name by Appropriate View name in your project
                return View("ExistingUser");
            }
            else
            {
                //User Appropriate overload of NotFound
                return NotFound();
            }
        }
    }
    private bool IsValidUser(string userId)
    {
        //Your logic to validate the existing user.            
    }

暫無
暫無

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

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