Experience Editorでコントローラーレンダリングで作成したフォームを送信するとトップページが表示される

samatsu 6/17/2016 1223 N/A Sitecore Programming

ライブサイト(公開サイト)で使っている場合は特に問題がないのですが、 エクスペリエンスエディターの編集やプレビューモードでController Rendering(コントローラーレンダリング)を使用して作成したフォームを送信するとトップページが表示されるという現象が発生したので対処方法を記載します。

まず、原因ですが、コンテンツエディターなどからxEditorをプレビューモードで起動するときに sc_itemid パラメーターが使用されるためです。  http://site.net/?sc_itemid=%7B11111111-2222-3333-4444-555555555555%7D みたいなURLになっていることをアドレスバーで確認できます。

コントローラーレンダリングを使用する場合に使用するフォームを生成する典型的なコードは次のようなものです。

<div>
    @using (Html.BeginRouteForm(MvcSettings.SitecoreRouteName, FormMethod.Post))
    {
        <!-- フォーム用のhtml -->
        <div>
            <input type="submit" value="send" />
        </div>
    }
</div>

formでpostするURLを生成するときにSitecoreでデフォルトで定義されるルート名(Sitecore)を使用しますが、この方法でルートを生成するとページをリクエストしたときのアドレスがそのままformのポスト先のURLになります。

そのため "/?sc_itemid=XXX" みたいなアドレスでリクエストが発生すると  "/" がフォームの送信先になります。フォームを送信するURLがトップページのパスになっているのでフォームを送信するとトップページが表示されたのは当然の結果となります。

ライブサイトで sc_itemid を指定してページをリクエストされることはないので(IDを知るすべがないため)まぁ気にしなくても問題はないと思います。どうしてもxEditorでsc_itemidを使用した場合もフォームが動作するようにしたい場合は次のように sc_itemidパラメーターを設定するようにしてください。都合のよいことにsc_itemidがクエリ文字列に存在しない場合はsc_itemidの設定は無視されformのポスト先のURLにsc_itemidは付与されません。

<div>
    @using (Html.BeginRouteForm(MvcSettings.SitecoreRouteName
        , new { sc_itemid = @HttpContext.Current.Request.QueryString["sc_itemid"] }
        , FormMethod.Post))
    {
        <!-- フォーム用のhtml -->
        <div>
            <input type="submit" value="send" />
        </div>
    }
</div>

これで、xEditorでsc_itemidを使用してページが表示された場合でも適切に動作するはずです。