[英]How to get all the parameters names of a Get Request (from query string)?
[英]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}");
您必須為此編寫自定義模型綁定器,或者為返回 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.