2017-02-07 6 views
5

私は、結果が成功したときにURL /アクションにリダイレクト/表示したいが、何らかのエラーがあった場合にはビューに戻るような状況がある。Asp.Net Coreはアクションにリダイレクトされますが、アクションを直接呼び出すことはできません。

たとえば、someWorkがtrueを返すときは、「成功したページ」にいくつかのデータが表示されますが、falseの場合はページに戻り、エラーが表示されます。

通常、ChildActionはこれを実行できますが、.Net Coreではそれらが存在しないようです。

これを達成するにはどうすればよいでしょうか?私の主な関心事は、誰かがブラウザバーにそれを書いた場合、「成功」ルート/アクションに直接アクセスできないようにすることです。

public IActionResult DoSomething() 
{ 
    bool success = someWork(); 
    if (success) 
    { 
     // goto some action but not allow that action to be called directly 
    } 
    else 
    { 
     return View(); 
    } 
} 
+0

以前のバージョンでは、[ChildActionOnly]メソッドを使用することはできませんでした –

答えて

3

一つの解決策(というかこの問題を回避するには)BOOLを保存して、他のアクションでそれを確認するために一時データを使用することです。このように:

public IActionResult DoSomething() 
{ 
    bool success=someWork(); 
    if(success) 
    { 
     TempData["IsLegit"] = true; 
     return RedirectToAction("Success"); 
    } 
    else 
    { 
     return View(); 
    } 
} 

public IActionResult Success 
{ 
    if((TempData["IsLegit"]??false)!=true) 
     return RedirectToAction("Error"); 
    //Do your stuff 
} 
0

ASP.NETコアには新機能View Componentsがあります。ビューコンポーネントは、クラスと結果(通常はカミソリビュー)の2つの部分で構成されています。 ViewコンポーネントはHTTPエンドポイントとして直接到達することはできず、コードから呼び出されます(通常はビュー内)。 あなたのニーズに最も適したコントローラから呼び出すこともできます。 成功メッセージ

<h3> Success Message <h3> 
Your Success Message... 

用かみそりビューを作成します。これらのファイルのビュー名とビューコンポーネント名とパスが非常によく似慣例に従う、ということ

public class SuccessViewComponent : ViewComponent 
{ 
    public async Task<IViewComponentResult> InvokeAsync() 
    { 
     return View(); 
    } 
} 

注対応するビュー・コンポーネントを作成します。コントローラとビュー。同じことについては、ASP.NETのコアドキュメントを参照してください。

は、あなただけのアクションをプライベートにすることができ、あなたのアクションメソッド

public IActionResult DoSomething() 
{ 
    bool success=someWork(); 
    if(success) 
    { 
     return ViewComponent("Success"); 
    } 
    else 
    { 
     return View(); 
    } 
} 
0

からビューコンポーネントを起動します。

public IActionResult DoSomething() 
{ 
    bool success = someWork(); 
    if (success) 
    { 
     // goto some action but not allow that action to be called directly 
     return MyCrazySecretAction(); 
    } 
    else 
    { 
     return View(); 
    } 
} 

private IActionResult MyCrazySecretAction() 
{ 
    return View(); 
} 
関連する問題