如何创建在UmbracoApiController中继承RenderModel的模型实例?

时间:2016-05-25 07:54:06

标签: umbraco umbraco7

我正在使用Umbraco CMS。我有以下型号:

 public class LoyaltyPromo : RenderModel
    {
        public LoyaltyPromo(IPublishedContent content)
            : base(content)
        {
        }
        //properties removed for brevity
    }

我想在UmbracoApiController中使用此模型。所以我这样做:

    public class PromoServiceController : UmbracoApiController
        {
            public async Task<object> GetAll()
            {

                var umbracoHelper = new UmbracoHelper(UmbracoContext.Current);
                IPublishedContent content = umbracoHelper.TypedContent(1050);
                var list = new List<LoyaltyPromo>();
                list.Add(new LoyaltyPromo(content));
                return list;

            }
        }

不幸的是它不起作用,我得到NullReferenceException

Screenshot where the exception occurs

  

发生了错误。   你调用的对象是空的。      System.NullReferenceException    在Umbraco.Web.Models.RenderModel..ctor(IPublishedContent   内容)在LoyaltyOps.Models.LoyaltyPromo..ctor(IPublishedContent   内容)在C:\ Users \ mkallingal \ documents \ visual studio中   2015 \ Projects \ LoyaltyOps \ LoyaltyOps.Models \ LoyaltyPromo.cs:第13行at   LoyaltyOps.Controllers.PromoServiceController.d__0.MoveNext()   在C:\ Users \ mkallingal \ documents \ visual studio中   2015年\项目\ LoyaltyOps \ LoyaltyOps \ \控制器PromoServiceController.cs:行   32 ---从异常的先前位置开始的堆栈跟踪结束   扔了 - 在   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Threading.Tasks.TaskHelpersExtensions.d__3`1.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()    

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您的问题是RenderModel不适合在WebAPI中使用,而WebAPI根本没有关于前端页面的上下文。内部RenderModel依赖于PublishedContentRequest正确设置的UmbracoContext属性,这在WebAPI中不会发生。

如果你确实需要在RenderModel上建立模型,那么使用替代构造函数:

RenderModel(IPublishedContent content, CultureInfo culture)

传递文化和内容 - 这将解决PublishedContentRequest被设置的需要,但你可能会遇到其他问题。

更好的方法是创建一个完全不依赖于RenderModel的视图模型。由于WebAPI通常会将您的模型序列化为JSON,因此您可以将它变得更好。

另一件事 - 您的GetAll()列表根本没有返回 - 我假设您的实际方法中没有进行额外处理,需要您的模型基于{{1}你刚刚返回列表了吗?