【问题标题】:How to create an instance of a model that inherits RenderModel inside UmbracoApiController?如何在 UmbracoApiController 中创建继承 RenderModel 的模型实例?
【发布时间】:2016-05-25 07:54:06
【问题描述】:

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

发生错误。 你调用的对象是空的。 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 行 LoyaltyOps.Controllers.PromoServiceController.d__0.MoveNext() 在 C:\Users\mkallingal\documents\visual studio 2015\Projects\LoyaltyOps\LoyaltyOps\Controllers\PromoServiceController.cs:line 32 --- 从上一个异常位置开始的堆栈跟踪结束 抛出---在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Threading.Tasks.TaskHelpersExtensions.d__3`1.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()

我该如何解决这个问题?

【问题讨论】:

  • 我认为您需要扩展您的代码示例,以便我们可以看到 LoyaltyPromo.cs:line 13,它说发生了空引用?
  • 嗨@ProNotion,第13行是public LoyaltyPromo(IPublishedContent content) : base(content) { }
  • 您正在使用硬编码的 id 获取已发布的内容节点,例如。 1050. 你确定这个id存在吗?
  • 嗨@Mivaweb,是的,它存在。我从 Umbraco ->Content->Promos-List (content name) -> Id (from the Properties tab) 复制了它。 IPublishedContent content = umbracoHelper.TypedContent(1050); 返回内容的所有信息;它不为空。
  • 我看到您正在使用异步任务,请在 stackoverflow 上查看此解决方案:stackoverflow.com/questions/23006976/…

标签: umbraco umbraco7


【解决方案1】:

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

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

RenderModel(IPublishedContent content, CultureInfo culture)

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

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

另一件事 - 您的 GetAll() 列表根本不会返回 - 我假设在您的实际方法中没有额外的处理需要您的模型基于 RenderModel,而您只是返回名单?

【讨论】:

  • 我在 RenderMvcController 中使用模型。我想我可以在UmbracoApiController 中重复使用它。我想我不被允许这样做。所以就像你建议的那样,我创建了一个单独的模型来迎合RenderMvcController 并使LoyaltyPromo 不继承自RenderModel
猜你喜欢
  • 1970-01-01
  • 2012-12-11
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2016-03-26
  • 1970-01-01
相关资源
最近更新 更多