Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在GET方法中验证查询字符串参数_C#_Asp.net Mvc_Asp.net Core_Asp.net Core Mvc_Asp.net Mvc Routing - Fatal编程技术网

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

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

我构建了一个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 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参数。