我已经构建了一个ASP.NET Core MVC应用程序,并且我使用了默认的MVC URL路由:
app.UseMvc(routes =>
{
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});
我想创建用于创建和编辑用户的GET
方法。
要创建新用户,我需要转到网址/Admin/User
并修改现有用户网址/Admin/User/{id:int}
我试图创建这样的方法:
[HttpGet]
public async Task<IActionResult> User(int? id)
{
}
如何限制id参数的类型?
我只需要允许访问/Admin/User
或/Admin/User/{id:int}
- 但如果我尝试ie - /Admin/User/ABCD
- (使用字符串作为ID) - 也允许这样做。
如果参数ID是另一种类型而不是数字,那么我想返回404
。
答案 0 :(得分:2)
最简单的选择是创建具有此约束的路由。请注意,如果您在此类路径中创建所需的参数,则没有理由使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}");
答案 1 :(得分:0)
您必须为此编写自定义模型绑定器,或者为返回404的每个其他类型创建重载。我只需重新考虑您的设计并使用不同的/ Admin / CreateUser操作来创建新用户而不是只是不允许没有ID的用户呼叫。
答案 2 :(得分:0)
可以使用单一方法实现。
如果您使用数字ID,则现有用户ID将大于零。对于新用户,Id将为零或小于零。
如果您正在使用字符串ID,那么对于现有用户,id将是非空字符串。例如。 A B C D。对于新用户,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.
}