WebAPI Nullable Guid ModelBinder无法调用

时间:2015-10-10 21:45:07

标签: asp.net-mvc asp.net-web-api model-binding

这是一个带有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永远不会调用。

0 个答案:

没有答案