2016-05-25 35 views
3

我正在使用Umbraco CMS。我有以下型號:如何創建一個繼承UmbracoApiController內的RenderModel的模型實例?

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:\用戶\ mkallingal \文件\視覺工作室 2015 \ Projects \ LoyaltyOps \ LoyaltyOps.Models \ LoyaltyPromo.cs:第13行 C:\ Users \ mkallingal \ documents \ visual studio中的LoyaltyOps.Controllers.PromoServiceController.d__0.MoveNext() 2015 \ Projects \ LoyaltyOps \ LoyaltyOps \控制器\ PromoServiceController.cs:行 32 ---從以前的位置,其中例外是 拋出的堆棧跟蹤結束---在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(T在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification問 任務)(任務 任務)在 System.Threading.Tasks.TaskHelpersExtensions.d__3`1.MoveNext() ---從以前的位置,其中異常堆棧跟蹤的結尾在 System.Web.Http.Controllers.ApiControllerActionInvoker.d__0被扔在--- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務 任務)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務 任務) .MoveNext() ---拋出異常的先前位置的堆棧跟蹤結束---在 System.Runtime.CompilerServices.Task Awaiter.ThrowForNonSuccess(任務 任務)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務 任務)在 System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext() ---從堆棧跟蹤的結尾以前的位置,其中的例外是在 System.Web.Http.Dispatcher在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification拋出---在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務 任務)(任務 任務) .HttpControllerDispatcher.d__1.MoveNext()

我該如何解決這個問題?

+0

我想你將需要擴展你的代碼示例,以便我們可以看到LoyaltyPromo.cs:第13行,它表示空引用正在發生? – ProNotion

+0

Hi @ProNotion,第十三行是'public LoyaltyPromo(IPublishedContent content) :base(content) {0123} {{0}}} – Irshu

+0

您正在使用硬編碼的標識符發佈內容節點,例如。 1050.你確定這個ID存在嗎? – Mivaweb

回答

2

您的問題是,RenderModel不打算在WebAPI中使用,WebAPI根本沒有關於前端頁面的上下文。內部RenderModel依賴於UmbracoContextPublishedContentRequest屬性被正確設置,這在WebAPI中不會發生。

如果你真的需要立足您的RenderModel模型,然後使用替代構造:

RenderModel(IPublishedContent content, CultureInfo culture)

而且在文化傳遞以及內容 - 這將得到解決,需要PublishedContentRequest被設置,但你可能會進一步遇到其他問題。

更好的方法是創建一個完全不依賴RenderModel的視圖模型。由於WebAPI通常將您的模型串行到JSON,所以打火機可以讓它更好。

另一件事 - 您的GetAll()列表完全沒有返回 - 我假設您的實際方法中沒有額外的處理,需要您的模型基於RenderModel,並且您只是返回清單?

+0

我在'RenderMvcController'裏面使用了模型。我想我可以在'UmbracoApiController'中重用它。我想我不能這樣做。所以就像你建議的那樣,我創建了一個獨立的模型來迎合'RenderMvcController'並使'LoyaltyPromo'不會從'RenderModel'繼承。 – Irshu

相關問題