3

パーシャルビューをレンダリングするためにマクロによって呼び出されるサーフェスコントローラーでチャイルドアクション関数を作成しようとしています。

この関数では、現在のページプロパティにアクセスして、レンダリングされたPartialViewを微調整する必要があります。

これは、ubootstrapのJorge Lusarのコードから取得したもので、HttpPostActionResult関数で正常に機能します。

var renderModel = (UmbracoRenderModel)ControllerContext.RouteData.DataTokens["umbraco"];
var currentPage = renderModel.CurrentNode.AsDynamic();

問題は、 [ChildActionOnly] PartialViewResult関数でこのエラーがスローされることです:

Unable to cast object of type 'System.String' to type 'Umbraco.Cms.Web.Model.UmbracoRenderModel'.
on 'var renderModel = (UmbracoRenderModel)ControllerContext.RouteData.DataTokens["umbraco"];'

DataTokens ["umbraco"]のデータは、2つの関数間で変更されているようです。それぞれにDataTokens["umbraco"]。ToString()を表示すると、次のようになります。

[ ChildActionOnly ]でpublicPartialViewResultInit()->「Surface」が表示されます。

[ HttpPort ]にpublicHandleSubmit(myModel model)->「Umbraco.Cms.Web.Model.UmbracoRenderModel」が表示されます。

ここでアドバイスをありがとう。

ニコラス。

4

7 に答える 7

6

私は Umbraco 6.0.4 を使用していますが、次のように簡単です。

var currentNode = Umbraco.TypedContent(UmbracoContext.PageId);
于 2013-06-05T16:40:35.207 に答える
2

の隠し値を失っているときに、Ajax Post 中に Surface Controller で Current Node Id を取得する際に発生する同じ問題uformpostroutevals

この値を投稿しようとしても、フォームから取得してレンダリングします

@using (Html.BeginUmbracoForm("<ActionName>", "<Controller Name>Surface"))

のすべてのプロパティにまだ null が UmbracoContextあるため、適切に初期化されていないようです。

HOTFIX : Ajax で送信する各フォームに CurrentNodeId を渡しています。

一般的なマスター ページでは、グローバルな JavaScript オブジェクトを作成しています。

<script type="text/javascript">
  var Global = {
    //..List of another variables which can be usefull of frontend
    currentNodeId: @CurrentPage.Id
  };
</script>

Global.currentNodeIdどのリクエストでも、次のパラメーターの 1 つとして簡単に使用できますdata

var sendData = {
    currentNodeId: Global.currentNodeId,
    // another params 
};

$.ajax({
    method: 'POST',
    data: JSON.stringify(sendData),
    contentType: 'application/json; charset=utf-8',
    url: '/Umbraco/Surface/<ControllerName>Surface/<ActionName>',
    dataType: 'json',
    cache: false
})

これは単なるホット フィックスであり、適切な解決策ではないことに注意してください。

于 2013-12-26T09:39:45.107 に答える
0

currentPageにアクセスするには、このコンストラクターをコントローラーに実装します

public class CommentSurfaceController : SurfaceController
{
    private readonly IUmbracoApplicationContext context;
    public CommentSurfaceController(IUmbracoApplicationContext context)
    {
        this.context = context;
    }
}

umbracos依存性注入を使用して、コンテキスト依存性を解決し、使用できるようにします。

SurfaceControllerhttps://github.com/umbraco/Umbraco5Docs/blob/5.1.0/Documentation/Getting-Started/Creating-a-surface-controller.mdでドキュメントを確認して ください

于 2012-04-23T11:31:30.517 に答える
0
var currentNode = Umbraco.TypedContent(UmbracoContext.PageId);

または、サーフェスコントローラーにオブジェクトがある場合

var currentNode = CurrentPage;

(定義に移動)

 //
 // Summary:
 //     Gets the current page.
 protected virtual IPublishedContent CurrentPage { get; }

currentPage コンテキストが解決されずにアクションを呼び出すことができるインスタンスがいくつかあるため、最初に null を確認してください。

于 2016-06-01T15:45:49.333 に答える