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

How to create an instance of a model that inherits RenderModel inside UmbracoApiController?

我正在使用 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:

An error has occurred. Object reference not set to an instance of an object. System.NullReferenceException at Umbraco.Web.Models.RenderModel..ctor(IPublishedContent content) at LoyaltyOps.Models.LoyaltyPromo..ctor(IPublishedContent content) in C:\Users\mkallingal\documents\visual studio 2015\Projects\LoyaltyOps\LoyaltyOps.Models\LoyaltyPromo.cs:line 13 at LoyaltyOps.Controllers.PromoServiceController.d__0.MoveNext() in C:\Users\mkallingal\documents\visual studio 2015\Projects\LoyaltyOps\LoyaltyOps\Controllers\PromoServiceController.cs:line 32 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Threading.Tasks.TaskHelpersExtensions.d__3`1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()

我该如何解决?

你的问题是 RenderModel 不打算在 WebAPI 中使用,它根本没有关于前端页面的上下文。在内部 RenderModel 依赖于 UmbracoContextPublishedContentRequest 属性 被正确设置,而 WebAPI 不会发生这种情况。

如果您确实需要将模型基于 RenderModel,请使用替代构造函数:

RenderModel(IPublishedContent content, CultureInfo culture)

并传递文化和内容 - 这将绕过设置 PublishedContentRequest 的需要,但您可能会 运行 进一步解决其他问题。

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

另一件事 - 你的 GetAll() 列表根本没有 return - 我假设你的实际方法中没有额外的处理要求你的模型基于 RenderModel,而您只是 return 列表?