如何在GET方法中验证查询字符串参数

时间:2018-02-17 17:39:37

标签: c# asp.net-mvc asp.net-core asp.net-core-mvc asp.net-mvc-routing

我已经构建了一个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

3 个答案:

答案 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}");

参考:Routing in ASP.NET Core

答案 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.            
    }