2017-12-28 17 views
0

コードは機能しますが、愚かです。RedirectResultにハッシュ/フラグメントを追加するとコードが煩雑になる

ビューがユーザーに返されると、ページはcompanyIdアンカーにスクロールします。

愚かな私は(「用語」なし)別のルートで別の公共アクションを公開しなければならないということです

私は企業ID /用語/にリダイレクトしたいが、私はこのアクションというambigiousActionの例外を取得同じルートがすでに存在しています...

可能であれば、そのジレンマを解決する方法は最初のルートを変更しませんか?

[HttpGet("~/terms/{companyId}")] 
public IActionResult Home(string companyId}) 
{ 
    string url = Url.Action(nameof(HomeForRedirect), new { companyId}) + "#conditions"; 
    return new RedirectResult(url); 
} 

[HttpGet("{companyId}")] 
public IActionResult HomeForRedirect(string companyId) 
{ 
    Viewbag.CompanyId = companyId; 
    return View(nameof(Home)); 
} 
+1

通常、ハッシュはクライアントサイドのものです。だから私はそれがあなたがそこに着くためにクリックして、HomeControllerに設定されていないリンクに存在するはずだと思います。 –

+0

ありがとう、私はそれが本当にうまく動作することを完全に忘れているので、それについて多くの投稿を見つけたので、それは解決策でなければならないと思ったが、実際には厄介な解決策:-)、ありがとう! – Pascal

答えて

1

私はあなたのコードを理解していた場合は、基本的にURL /terms/{companyId}/{controller}/{companyId}#conditionsにリダイレクトしたいですか?最も簡単な方法は、両方のルートを同じアクションに接続し、条件付きでリダイレクトを行うことです。次のようなものがあります。

[HttpGet("{companyId}", Order = 1)] 
[HttpGet("~/terms/{companyId}", Order = 2)] 
public IActionResult Home(string companyId) 
{ 
    if (Context.Request.Path.StartsWith("/terms")) 
    { 
     var url = Url.Action(nameof(Home), new { companyId }) + "#conditions"; 
     return Redirect(url); 
    } 

    ViewBag.CompanyId = companyId; 
    return View(); 
} 

さらに良い方法は、IISで直接リダイレクトを行うことです。 ASP.NETのコア機械で要求を処理するには、処理があまり重要ではありません。リダイレクトするだけの無駄な作業です。 IISのURL書き換えモジュールを使用してこのURLのリダイレクトを設定すると、アプリケーションでまったく心配する必要はありません。ビューを返す通常の常用のHomeアクションがあれば、すべてうまくいくでしょう。

他のいくつかのノートあなたがこれに新しいしているように思えるので、:

  • それはデフォルトでGETであるというより具体的なHttpGetなどよりRoute属性を使用することをお勧めします。
  • RedirectなどのコントローラメソッドをIActionResult(つまりnew RedirectResult(...))ではなく返します。
  • デフォルトでは、アクションと同じ名前のビューが返されます。したがって、あなたの行動がHomeであると仮定すると、return View(nameof(Home))ではなく、return View()とすることができます。
+0

ヒントはありがたいですが、上記のコメントをご覧ください。あなたは私があなたの答えをupvoteする必要があることをたくさん書いた、または私は悪い気持ちを持っています;-) – Pascal

関連する問題