2011-10-30 13 views
3

ActionResultを返すコントローラーメソッドを作成し、最後にView()を呼び出すと、Filter(または何かsimular)がViewResultから返された結果をPartialViewResultに基づいて変更する方法がありますかリクエストの条件にMVC3:アクション自体のコードの外側で結果の型を変更することは可能ですか?

明らかに、ViewResultまたはPartialViewResultを返すコントローラメソッド自体にコードを含めることができますが、これはいくつかの場所に表示されるので、Filterをうまく使用するようです。 IResultFilterの両方のメソッドでこれを実行してみましたが、出力に変化は見られませんでした。

これができない場合は、ベースコントローラーでViewの代わりに呼び出すことのできるViewOrPartialと呼ばれるメソッドをいくつか作成することにしますが、フィルターをあきらめる前にもっと広い知恵を求めたかったのですそれ)アプローチ。

おかげで、 マシュー

更新:だから、私は何をしようとしたとするものとの間に少なくとも1つの差は今ダーリンのコードに基づいて取り組んでいることが表示されます私はOnResultExecutingをオーバーライドしていた(と私もOnResultExecutedをしようとした)ということですDarinのコードはOnActionExecutedをオーバーライドします。それは奇妙に見えるか、おそらく私は何か他を見落としていますか?私はそれがうまく動作することを嬉しく思っていますが、IResultFilterインターフェイスに接続する方が意味があるようです。私は2つのインターフェイスの意図をもっと調べなければならないでしょう。

+0

を私はMVC3を使用し始めていると、本当に答えに興味があります!誰かが解決策を提供できることを願っています。 – Jared

+0

絶対に 'IActionFilter'や' IResultFilter'を使って結果を変更することができます。それを適用するのを忘れましたか?あなたは動作していないコードを投稿できますか? – Aaronaught

+0

ばかげた私はそれを削除しました。私はダーリンのコードから作業していますが、私が間違っていたことが分からないことは自分自身には迷惑をかけています。 –

答えて

9

はい、それは可能である:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var result = filterContext.Result; 
     var viewResult = result as ViewResult; 
     var someValue = filterContext.Controller.ValueProvider.GetValue("someValue"); 
     if (viewResult != null && someValue != null && someValue.AttemptedValue == "foo") 
     { 
      // if the controller action returned a view result 
      // and the someValue parameter equals foo we replace the 
      // view result initially returned by the action by a 
      // partial view result 
      var partialResult = new PartialViewResult(); 
      partialResult.ViewData.Model = viewResult.Model; 
      filterContext.Result = partialResult; 
     } 
    } 
} 

その後飾る:

[MyActionFilter] 
public ActionResult Foo() 
{ 
    MyViewModel vm = ... 
    return View(vm); 
} 
+1

+1、@Darin、これを 'ActionFilter'と' ViewResultBase'のカスタム派生との違いにどう感じますか? – smartcaveman

+1

@smartcaveman、私は確かに言うには十分なコンテキストがありませんが、カスタムアクションの結果は良い考えのようです。もちろん、OPからの文脈が十分でなくても、言うことは難しいです。より良い解決策があるかもしれません。これは、SOに関するほとんどの問題の問題です。 OPは、単にシナリオや目標を十分に説明していないため、これを行わないと、より具体的なケースに合わせてより適切な回答が失われる可能性があります。 OPは、行動から結果を変えたいが、どのような目的でそれが明確でないかだけを話した。 –

+0

より多くの文脈を提供して幸いです。 "プログレッシブエンハンス"の方法で私のアプリケーションを行うために、私は多くのアクションがデフォルトでフルページを返すが、javascriptが有効な場合はjquery UIダイアログでレンダリングする。その場合、私は完全なhtmlページを必要とせず、スニペットだけを必要とします。私は将来もっと多くの文脈を提供しようと努力するつもりです。 Darinのコードはうまくいきました。私のものはかなり似ていました(代わりにResultFilterを使用しました)。私は質問を投稿する前に私はそれを愚かに削除したので、私がこの時点で間違っていたことを確かめることはできません。 –

関連する問題