Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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# 处理在控制器操作中解析可为null的参数所导致的异常_C#_Asp.net Mvc - Fatal编程技术网

C# 处理在控制器操作中解析可为null的参数所导致的异常

C# 处理在控制器操作中解析可为null的参数所导致的异常,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个终点 [HttpGet] public async Task<ActionResult> GetNodes([FromQuery] Guid? parentId) [HttpGet] 公共异步任务GetNodes([FromQuery]Guid?父ID) 就这样说吧 GET…/api/nodes?parentId=null Asp.net在分析参数“值'null'无效”时引发异常。 如果发生异常,如何重写该行为以使其将可为null的类型解析为null 我期望: GET…/

我有一个终点

[HttpGet]
public async Task<ActionResult> GetNodes([FromQuery] Guid? parentId)
[HttpGet]
公共异步任务GetNodes([FromQuery]Guid?父ID)
就这样说吧
GET…/api/nodes?parentId=null

Asp.net在分析参数“值'null'无效”时引发异常。
如果发生异常,如何重写该行为以使其将可为null的类型解析为null

我期望:
GET…/api/nodes?parentId=null
应使用
parentId==null


GET…/api/nodes?parentId=50d21dd-6a95-46db-bfff9-c943cf5b0df1
应使用
parentId=“50d21dd-6a95-46db-bf9-c943cf5b0df1”调用操作



GET…/api/nodes?parentId=something\u不可解析\u-guid
应使用
parentId=null

调用操作@Karan的解决方案是您应该采用的方法。但是,如果您不愿意更改客户端脚本,您仍然可以选择以下选项:

[HttpGet]
public async Task<ActionResult> GetNodes() {
     var parentId = Request.QueryString["parentId"].ToString();
     Guid guid;
     if (Guid.TryParse(parentId , out guid))
     {
       // use guid here
     }

}
[HttpGet]
公共异步任务GetNodes(){
var parentId=Request.QueryString[“parentId”].ToString();
Guid;
if(Guid.TryParse(parentId,out-Guid))
{
//在这里使用guid
}
}

Guid
参数转换为
string
,然后尝试使用
Guid.TryParse

[HttpGet]
public async Task<ActionResult> GetNodes([FromQuery] string parentId)
{
        Guid guid;
        if (Guid.TryParse(parentId, out guid))
        {
            // code when guid is not null.
            // use guid object.
        }
        else
        {
            // code when guid is null.
        }
}
[HttpGet]
公共异步任务GetNodes([FromQuery]字符串父ID)
{
Guid;
if(Guid.TryParse(parentId,out-Guid))
{
//guid不为空时的代码。
//使用guid对象。
}
其他的
{
//guid为空时的代码。
}
}

我刚刚制作了一个简单的
IModelBinder
,如果字符串支持默认转换,它可以将字符串转换为所需类型的实例
代码如下所示:

public Task BindModelAsync(ModelBindingContext bindingContext)
{
    var targetType = bindingContext.ModelType;
    var targetName = bindingContext.ModelName;
    var stringValue = bindingContext.ValueProvider.GetValue(targetName).FirstValue;

    var isNullableOrReference = Nullable.GetUnderlyingType(targetType) != null ||
                                !targetType.IsValueType;

    var valueProvider = bindingContext.ValueProvider.GetValue(targetName);
    try
    {
        var converter = TypeDescriptor.GetConverter(targetType);
        var resultValue = converter.ConvertFromString(stringValue);

        bindingContext.Result = ModelBindingResult.Success(resultValue);
        bindingContext.ModelState.SetModelValue(targetName, valueProvider);
    }
    catch (NotSupportedException e)
    {
        bindingContext.Result = ModelBindingResult.Failed();
        return Task.CompletedTask;
    }
    catch (Exception e)
    {
        bindingContext.Result = ModelBindingResult.Success(isNullableOrReference ? null : Activator.CreateInstance(targetType));
        bindingContext.ModelState.SetModelValue(targetName, valueProvider);
    }

    return Task.CompletedTask;
}

它需要稍微调整一下,但它的工作方式与我希望的一样

使用
字符串
类型而不是
Guid
?查询字符串中的Null被视为字符串,它将无法转换为Guid。。。使用字符串类型是更好的选择。@chetanranpariya我不认为使用原始字符串而不是guid是更好的选择。如果我需要与guid进行一些比较,我必须创建一个guid实例,而不是仅仅检查它null@vikscool在字符串中,我期望
parentId=null
“null”
parentId=
null
[HttpGet]公共异步任务GetNodes([FromQuery]Guid?parentId=null)或[HttpGet]公共异步任务GetNodes([FromQuery]Guid?=默认值(Guid))我也提出了相同的建议+1但仍然需要首先声明
guid
对象。或者如果使用C#7或更高版本,那么我们可以定义为
if(Guid.TryParse(parentId,out-Guid-Guid))