如何在 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 依赖于 UmbracoContext
的 PublishedContentRequest
属性 被正确设置,而 WebAPI 不会发生这种情况。
如果您确实需要将模型基于 RenderModel,请使用替代构造函数:
RenderModel(IPublishedContent content, CultureInfo culture)
并传递文化和内容 - 这将绕过设置 PublishedContentRequest
的需要,但您可能会 运行 进一步解决其他问题。
更好的方法是创建一个完全不依赖 RenderModel 的视图模型。由于 WebAPI 通常会将您的模型序列化为 JSON,因此越轻便越好。
另一件事 - 你的 GetAll() 列表根本没有 return - 我假设你的实际方法中没有额外的处理要求你的模型基于 RenderModel
,而您只是 return 列表?
我正在使用 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 依赖于 UmbracoContext
的 PublishedContentRequest
属性 被正确设置,而 WebAPI 不会发生这种情况。
如果您确实需要将模型基于 RenderModel,请使用替代构造函数:
RenderModel(IPublishedContent content, CultureInfo culture)
并传递文化和内容 - 这将绕过设置 PublishedContentRequest
的需要,但您可能会 运行 进一步解决其他问题。
更好的方法是创建一个完全不依赖 RenderModel 的视图模型。由于 WebAPI 通常会将您的模型序列化为 JSON,因此越轻便越好。
另一件事 - 你的 GetAll() 列表根本没有 return - 我假设你的实际方法中没有额外的处理要求你的模型基于 RenderModel
,而您只是 return 列表?