2011-02-02 8 views
1

から呼び出されるアクションの上書き、私はこれを呼び出す:私の見解の終わりにChildActionExtensions

<%= Html.Action("ProductLayoutAndLimits", this.Model) /* Render product-specific options*/ %> 

アクションは私のコントローラで仮想であること:

[ChildActionOnly] 
    public virtual ActionResult ProductLayoutAndLimits(DeliveryOptionsViewModel optionsViewModel) 
    { 
     return new EmptyResult(); 
    } 

意図は、私はこれをオーバーライドするというものでしたメソッドを特定のコントローラに適用します。当然、私はこれをしました:

public override System.Web.Mvc.ActionResult ProductLayoutAndLimits(DeliveryOptionsViewModel optionsViewModel) 
    { 

しかし、ブレークポイントはヒットしないので、私のオーバーライドは選択されません。私は使用すべき異なる過負荷がありますか?あるいは別のオブジェクトを渡す必要がありますか?それとも、製品特有のアクションに必要なアノテーションが検出されていますか?

何か助けていただければ幸いです。ありがとう!

編集

すべての提案が高く評価されていますが、私は実際にはかなり異なった手法を示唆よりも、私の質問に答えるソリューションの中で最も興味を持っています。

テンプレートが提案されましたが、新しい追加のビューコードがレンダリングされる前にコントローラコードが実行される必要があることに注意してください。ベースコントローラは、他の製品のプラットフォームとして機能するソリューションに含まれています。彼らは製品特有のことをすることはできません。彼らが彼らの見解を描写した後、私の子供の行動のオーバーライドが呼び出されるという意図があります。私のコントローラコードは、ビューをレンダリングする前にモデルのプロパティを設定する方法を決定するために、いくつかのものをチェックします。

編集

私は問題を発見しました。私はいつものように馬鹿だと感じる。プラットフォームのビューコードからHtml.Actionが呼び出されました。私たちは7月以来、このために製品固有のビューを使用していることが判明しました。私たちは通常、製品固有の見解を使用していないため気づいていませんでした。うわー!

+1

ベースコントローラーのProductLayoutAndLimitsメソッドでブレークポイントを設定しましたが、そのブレークポイントにヒットしましたか?もしそうなら、おそらくHtml.Actionに間違ったコントローラを使用するように伝えているでしょう。要求がBase :: SomeActionから発生した場合、Html.Action( "SomeOtherAction")を呼び出すとBase :: SomeOtherActionが検索されます。 Derived :: SomeOtherActionを探すために、Html.Actionにパラメータとして "Derived"を渡す必要があります。 – Levi

+0

私の編集を参照してください。その呼び出しは作成されていませんでした。少年は私が馬鹿だと感じますか? – Samo

+0

@Levi:私の問題は実際に私が見落としたものでしたが、あなたの答えは確かに正しいです。私の製品のアクションがヒットする唯一の方法は、私の製品のコントローラがビューをレンダリングするコントローラであるかどうかです。私はそれを受け入れることができるように答えとして投稿してもらえますか?ありがとう! – Samo

答えて

0

なぜこれを処理するために子のアクションとオーバーライドコントローラを使用していますか? ProductLayoutAndLimitsは、対応する表示テンプレートの名前になり

<%= Html.DisplayForModel("ProductLayoutAndLimits") %> 

:なぜテンプレートが表示されません。

例:

モデル:

public class BaseViewModel 
{ 
    public string BaseProp { get; set; } 
} 

public class DerviedViewModel : BaseViewModel 
{ 
    public string DerivedProp { get; set; } 
} 

コントローラー:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new DerviedViewModel 
     { 
      BaseProp = "base prop", 
      DerivedProp = "derived prop" 
     }); 
    } 
} 

ビュー(~/Views/Home/Index.cshtml):

@model AppName.Models.BaseViewModel 
@Html.DisplayForModel() 

表示テンプレート(~/Views/Home/DisplayTemplates/DerviedViewModel.cshtml):

@model AppName.Models.BaseViewModel 
@Html.DisplayFor(x => x.BaseProp) 

とあなたのコントローラのアクションは、基本クラスを返されていた場合は、このテンプレートがレンダリングされていたであろう:あなたは、ベースクラス(~/Views/Home/DisplayTemplates/BaseViewModel.cshtml)の表示テンプレートを持つことができます。もちろん、

@model AppName.Models.DerviedViewModel 
@Html.DisplayFor(x => x.BaseProp) 
@Html.DisplayFor(x => x.DerivedProp) 

モデルとして。

+0

その理由は、ベースコントローラーに固有の製品は何もできないためです。言い換えれば、そこから 'DerivedProp'を設定することはできません。ベースコントローラクラスは、他の製品のプラットフォームとして機能するコードに属します。派生クラスのプロパティの値を設定するのは、製品固有のコントローラに依存します。 – Samo

+0

@Samo、OK、あなたのケースではまだ表示テンプレートがうまくいくはずです。 –

+0

どのように?私はプロパティを設定するためにコントローラコードが必要です。ビュー内でそのようなことをすると、MVCが壊れてしまいます。私はテンプレートがどのように私のために働くのか理解していない。 – Samo

関連する問題