这是一个带有WebAPI的C#MVC项目。
我有这个模型类
public class Task
{
public int Id { get; set; }
public string Name { get; set; }
public Guid? AssignTo { get; set; }
}
AssignTo是一个可以为空的Guid,因为这个链接指向使用Guid for Id的其他系统上的Id。但它可以为空,因为有些情况下任务可以分配给任何人。
我使用WebAPI控制器来创建新任务。
public class TasksController : ApiController
{
[HttpPost]
public void Create(Task task)
{
// ... code to insert the task in the database
}
}
应用程序将此ajax POST请求发送到WebAPI:
{"Name":"Initial task","AssignTo":"81re1cd1-aea4-41d1-98dc-848a70953861"}
但是AssignTo属性永远不会是我的任务对象永远不会填充。我在调试期间检查了ModelState,发现了以下错误信息:
{"Error converting value \"81re1cd1-aea4-41d1-98dc-848a70953861\" to type 'System.Nullable`1[System.Guid]'. Path 'AssignTo', line 1, position 89."}
之后我尝试为Guid创建一个ModelBinder?按照此帖WebAPI ModelBinder Error中的此说明帮助映射我的财产。
所以这是我的ModelBinder
public class NullableGuidModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (string.IsNullOrEmpty(valueResult.AttemptedValue)) {
bindingContext.Model = new Guid?();
return true;
} else {
Guid value;
bool parseResult = Guid.TryParse(valueResult.AttemptedValue, out value);
if (parseResult) {
bindingContext.Model = new Guid?(value);
return true;
} else {
bindingContext.ModelState.AddModelError(
bindingContext.ModelName, "Invalide Guid format");
return false;
}
}
}
}
我在WebApiConfig中添加此代码以注册我的新ModelBinder
var provider = new SimpleModelBinderProvider(
typeof(Guid?), new NullableGuidModelBinder());
config.Services.Insert(typeof(ModelBinderProvider), 0, provider);
但毕竟这个我的Guid永远不会填充,当我尝试在其中设置断点时,我的ModelBinder永远不会调用。