2016-12-17 45 views
1

通知をTempDataに保存してユーザーに表示したかったのですが、このための拡張メソッドを作成し、ActionResultから拡張するクラスを実装します。 でのoverride ExecuteResultメソッドにアクセスする必要があります。ExecuteResult Asp.Net MVCコアのTempDataにアクセス

拡張メソッド:

public static IActionResult WithSuccess(this ActionResult result, string message) 
{ 
    return new AlertDecoratorResult(result, "alert-success", message); 
} 

はのActionResultクラスを拡張します。

public class AlertDecoratorResult : ActionResult 
{ 
     public ActionResult InnerResult { get; set; } 
     public string AlertClass { get; set; } 
     public string Message { get; set; } 
    public AlertDecoratorResult(ActionResult innerResult, string alertClass, string message) 
    { 
     InnerResult = innerResult; 
     AlertClass = alertClass; 
     Message = message; 
    } 

    public override void ExecuteResult(ActionContext context) 
    { 
     ITempDataDictionary tempData = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionary)) as ITempDataDictionary; 

     var alerts = tempData.GetAlert(); 
     alerts.Add(new Alert(AlertClass, Message)); 
     InnerResult.ExecuteResult(context); 
    } 
} 
コントローラ

return RedirectToAction("Index").WithSuccess("Category Created!"); 

から

コール拡張メソッド私は、私は 'ExecuteResult' メソッドで 'TempDataを' にアクセスすることができますどのように、 'TempDataを' ヌルを取得します。

enter image description here

答えて

0

私はTempDataを取得する方法を見つけます。それから得る必要がありますITempDataDictionaryFactory

var factory = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory; 
var tempData = factory.GetTempData(context.HttpContext); 
2

私は、文字通り、今日まったく同じことをやろうとしました(私たちは同じPluralsightコースを見たことがありますか?;-))とあなたの質問はTempDataを(おかげで!)アクセスする方法を見つけるために私を導きました。

デバッグ時にExecuteResultのオーバーライドが呼び出されていないことがわかったので、代わりに新しい非同期バージョンを試しました。それはうまくいった!コントローラが非同期ではないとして...その上でいくつかの読書を行う必要がある非同期メソッドが呼び出された理由を

public override async Task ExecuteResultAsync(ActionContext context) 
{ 
    ITempDataDictionaryFactory factory = context.HttpContext.RequestServices.GetService(typeof(ITempDataDictionaryFactory)) as ITempDataDictionaryFactory; 
    ITempDataDictionary tempData = factory.GetTempData(context.HttpContext); 

    var alerts = tempData.GetAlert(); 
    alerts.Add(new Alert(AlertClass, Message)); 

    await InnerResult.ExecuteResultAsync(context); 
} 

はしかし、私は完全には理解していない:あなたがする必要がどのような

ではなくExecuteResultAsyncをオーバーライドしています...

+1

はい私たちは同じコースをします。私のExecuteResultが呼び出されましたが、警告がTempDataに永続化されませんでした。私は非同期メソッドでも試みましたが、問題は同じです。アラートは持続せず、表示されませんでした。あなたはこれをやりましたか? – Ahmar

+0

(遅れて申し訳ありません、新しい年が来ました:-)はい、それは私のために働いています、私は私のビューでTempData.GetAlertsにアクセスし、そこからデータを取得することができます。ナゲットパッケージ "Microsoft.AspNetCore.Session"と "Microsoft.Extensions.Caching.Memory"を追加し、次に "services.AddMemoryCache(); services.AddSession();"を追加するセッションを有効にする必要がありましたStartup.csのConfigureServicesメソッド内にあります。そして、 "app.UseSession();" Configureメソッドを使用します。 –

+0

私は同じことをやっていますが、ビュー内のTempDataにアクセスすると、それは常に空ですか? – Cocowalla

関連する問題