C# 如何在GET方法中验证查询字符串参数
我构建了一个ASP.NET核心MVC应用程序,并使用了默认的MVC URL路由:C# 如何在GET方法中验证查询字符串参数,c#,asp.net-mvc,asp.net-core,asp.net-core-mvc,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,Asp.net Mvc Routing,我构建了一个ASP.NET核心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
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)
{
}
routes.MapRoute(
name: "defaultWithId",
template: "{controller}/{action}/{id:int}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}");
[HttpGet]
公共异步任务用户(int?id)
{
}
如何限制id参数的类型
我只需要允许访问/Admin/User
或/Admin/User/{id:int}
——但如果我尝试,例如-/Admin/User/ABCD
-(使用字符串作为id),它也是允许的
如果参数ID是另一种类型而不是数字,那么我想返回
404
您必须为此编写一个自定义模型绑定器,或者为返回404的每个其他类型创建一个重载。我只需重新考虑您的设计,使用不同的/Admin/CreateUser操作来创建新用户,只是不允许没有ID的用户调用。可以使用单一方法实现
如果您使用的是数字id,则现有用户id的值将大于零。对于新用户,Id将为零或小于零
如果您使用的是字符串id,那么对于现有用户,id将是非空字符串。例如ABCD。对于新用户,Id将为空
基于此逻辑,您可以发送适当的响应或404响应。
如果您使用的是字符串ID,那么请更改Get方法的数据类型。不要使用可为null的int,而是使用string
下面的代码可能会有所帮助
[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.
}
[HttpGet(“{id}”)]
公共异步任务用户(字符串id)
{
if(string.IsNullOrWhiteSpace(id))
{
//在项目中用适当的视图名称替换新用户视图名称
返回视图(“新用户”);
}
其他的
{
var isValidUser=isValidUser(id);
if(isValidUser)
{
//在项目中用适当的视图名称替换现有的用户视图名称
返回视图(“现有用户”);
}
其他的
{
//NotFound的用户适当重载
返回NotFound();
}
}
}
私有bool-IsValidUser(字符串用户ID)
{
//验证现有用户的逻辑。
}
最简单的选择是使用此约束创建路线。请注意,如果将路由中所需的参数设置为这样,则没有理由将id
设置为空
[HttpGet("Admin/User")]
public async Task<IActionResult> Add()
{
}
[HttpGet("Admin/User/{id:int}")]
public async Task<IActionResult> Edit(int id)
{
}
注意,基于约定的方法没有区分GET/POST
或者,如果您希望将所有ID参数设置为int
,您可以如下配置整个站点的路由:
[HttpGet]
public async Task<IActionResult> User(int? id)
{
}
routes.MapRoute(
name: "defaultWithId",
template: "{controller}/{action}/{id:int}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}");
参考:我对这些类型的操作使用了单一视图-用于创建和编辑-是否可以创建两种类型的方法,如您所述-/Admin/CreateUser和/Admin/EditUser,并使用相同的视图?是的,可以使用相同的方法名称但不同的参数(不同的签名)@Jenan在调用视图时,只需指定视图的名称,即可使用相同的视图,例如-return view(“viewName”,modelObject);在这两个操作中,只需使用相同的视图名称谢谢-相同的方法名称意味着什么?如何创建视图以创建新用户?出于这个原因,我想创建一个可以为null的ID。最好使用一个action方法创建,另一个action方法编辑分离关注点。所有这些路由配置都涵盖了这一点。您能为ID类型integer修改此用户方法吗?因此,我使用了可为null的ID参数。