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))