如何在Sitecore中使用自定义模型绑定器来传递数组的特定WebApi路由?

时间:2016-10-10 17:08:56

标签: asp.net-web-api sitecore sitecore8 sitecore-mvc

我的基本Sitecore WebAPI路线工作得很好。但是,当我需要将一个整数数组传递给自定义Sitecore WebApi路由时,我得到404.如何做到这一点?以下是我尝试过的,并且在典型的WebApi路线中完美运行(没有sitecore)。

路线

AddWebApiRoute(
           name: "StudentsCourseList",
           routeTemplate: "api/v1/students/courselist",
           defaults: new { controller = "StudentsApi", action = "GetCourses" });

Api控制器

public class StudentsApi: ApiController
{
    public async Task<IHttpActionResult> GetCourses([ModelBinder(typeof(CommaDelimitedArrayModelBinder))]long[] courseids)
    {
      var result = await _client.GetCourses(courseids);

        if (result == null)
        {
            return NotFound();
        }

        return Ok(result);
    }

}

自定义模型活页夹

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
    var key = bindingContext.ModelName;
    var val = bindingContext.ValueProvider.GetValue(key);
    if (val != null)
    {
        var s = val.AttemptedValue;
        if (s != null)
        {
            var elementType = bindingContext.ModelType.GetElementType();
            var converter = TypeDescriptor.GetConverter(elementType);
            var values = Array.ConvertAll(s.Split(new[] { ","},StringSplitOptions.RemoveEmptyEntries),
                x => { return converter.ConvertFromString(x != null ? x.Trim() : x); });

            var typedValues = Array.CreateInstance(elementType, values.Length);

            values.CopyTo(typedValues, 0);

            bindingContext.Model = typedValues;
        }
        else
        {
            // change this line to null if you prefer nulls to empty arrays 
            bindingContext.Model = Array.CreateInstance(bindingContext.ModelType.GetElementType(), 0);
        }
        return true;
    }
    return false;
}

然后尝试如下调用,返回404

/api/v1/students/courselist?courseids=1,2,3

作为Sitecore路线设置的一部分,是否需要完成任何缺失部分?

1 个答案:

答案 0 :(得分:0)

要让Sitecore和WebApi协调工作,您需要在httpRequestBegin管道中添加处理器以使路由正常工作。您可以在线查找信息甚至源代码,例如: http://patrickdelancy.com/2013/08/sitecore-webapi-living-harmony