1

現在、Umbraco MVC 4 プロジェクト バージョン 6.0.5 に取り組んでいます。プロジェクトは現在、Vega.USiteBuilder を使用して、マッピング属性を持つ厳密に型指定されたクラスに基づいて、バックオフィスで適切なドキュメント タイプを構築します。したがって、すべてのカミソリ ファイルは UmbracoTemplatePageBase から継承します。

Razor ファイルから HTTP GET を呼び出そうとすると、障害が発生します。たとえば、Html.BeginUmbracoForm を使用して SurfaceController を使用して、コントローラー アクション メソッドに送信する複数のフィールドを持つ検索フォームです。

私の Html.BeginUmbracoForm は次のようになります

@using (Html.BeginUmbracoForm("FindTyres", "TyreSearch"))
{
 // Couple of filter fields
}

基本的に、Umbraco の外部 (Umbraco データベースの外部) の外部データベースからいくつかのレコードを取得し、その結果をカスタム ビュー モデルで Umbraco フロント エンド ビューに返すシナリオがあります。コントローラーとアクション メソッドが SurfaceController から継承するようにセットアップされ、その後コンパイルして検索を送信すると、要求された URL が指定された場所に 404 リソースが見つかりません: /umbraco.RenderMVC.

ここに私のコードスニペットがあります:

public ActionResult FindTyres(string maker, string years, string models, string vehicles)
        {
            var tyreBdl = new Wheels.BDL.TyreBDL();
            List<Tyre> tyres = tyreBdl.GetAllTyres();

            tyres = tyres.Where(t => string.Equals(t.Maker, maker, StringComparison.OrdinalIgnoreCase)
                                     && string.Equals(t.Year, years, StringComparison.OrdinalIgnoreCase)
                                     && string.Equals(t.Model, models, StringComparison.OrdinalIgnoreCase)
                                     && string.Equals(t.Version, vehicles, StringComparison.OrdinalIgnoreCase)).ToList();

            var tyreSearchViewModel = new TyreSearchViewModel
            {
                Tyres = tyres
            };

            ViewBag.TyreSearchViewModel = tyreSearchViewModel;

            return CurrentUmbracoPage();
        }

次に、標準の MVC である Html.BeginForm (唯一の違い) を使用します。上記の手順を繰り返して検索を送信すると、次の YSOD エラーが発生します。

SurfaceController フォームを使用する場合、UmbracoPageResult は Http POST のコンテキストでのみ使用できます

以下は、HTML BeginForm のスニペットです。

@using (Html.BeginForm("FindTyres", "TyreSearch"))
{
 // Couple of filter fields
}

コントローラーにカスタムモデルをかみそりファイルに返させるために、Umbracoルートと戦っているように感じます。カスタム ルートを作成しようとするまで、基本的な検索を行ってカスタム モデルを Umbraco フロント エンド ビューに戻す方法を見つけようと、Google でよく検索しましたが、それもうまくいきませんでした。

カスタム モデルを返すために、コントローラーは特別な umbraco コントローラー クラスから継承する必要がありますか? 私は基本的に HTTP GET リクエスト (必須) を呼び出して、基準検索フィールドが URL のクエリ文字列に適切に反映されるようにしたいと考えています。たとえば、検索ボタンを押すと、アドレス ブラウザ バーに URL の例が表示されます。

http://[ドメイン名]/selecttyres.aspx/TyresSearch/FindTyresMake=ASIA&Years=1994&Models=ROCSTA&Vehicles=261

したがって、Surface Controller は HTTP Post のコンテキストで動作するため、使用できません。

umbraco コントローラー、ルート、およびパイプラインについて詳しく読むことができる優れたリソース資料はありますか。

このシナリオが理解できることを願っています。ご不明な点がございましたら、お気軽にお問い合わせください。ここからプロジェクトを続行するには、この概念を理解する必要があり、締め切りがあります。

4

2 に答える 2

1

これについては多くの質問があり、信頼できるアプローチを探すのに最適な場所は、Umbraco MVC のドキュメントです。

ただし、はい、使用すると、アクションHtml.BeginUmbracoForm(...)を強制されることがわかります。HttpPostこの種の機能 (検索フォーム) では、通常、GET メソッドを使用して手動でフォームを作成し、クエリ文字列を特定のノード URL に送信します。

<form action="@Model.Content.Url"> ... </form>

そのページには@Html.Action("SearchResults", "TyresSearch")、クエリ文字列のキーにマップするモデルを持つを含めます。

[ChildAction]
public ActionResult(TyreSearchModel model){

    // Find results
    TyreSearchResultModel results = new Wheels.BDL.TyreBDL().GetAllTyres();

    // Filter results based on submitted model
    ...

    // Return results
    return results;
}

TyreSearchResultModel結果ビューには、 (または選択したもの)のモデルが必要です。

このアプローチは、Umbraco の Controller 実装の必要性を回避し、非常に簡単です。

于 2013-07-11T10:56:09.837 に答える