web-dev-qa-db-ja.com

ASP.NETMVCアクションメソッドのクエリ文字列を削除します

次のようなアクションメソッドがあります。

public ActionResult Index(string message)
{
  if (message != null)
  {
    ViewBag.Message = message;
  }
  return View();
}

これに対するリクエストのURLは次のようになります。

www.mysite.com/controller/?message=Hello%20world

しかし、私はそれがちょうど見えるようにしたい

www.mysite.com/controller/

Actionmethod内のクエリ文字列を削除する方法はありますか?

13
willvv

いいえ、POSTメソッドを使用しない限り、情報は何らかの方法で渡される必要があります。別の方法として、中間クラスを使用することもできます。

// this would work if you went to controller/SetMessage?message=hello%20world

public ActionResult SetMessage(string message)
{
  ViewBag.Message = message ?? "";
  return RedirectToAction("Index");
}

public ActionResult Index()
{
  ViewBag.Message = TempData["message"] != null ? TempData["message"] : "";
  return View();
}

または。単にPOSTを使用した場合

//your view:
@using(Html.BeginForm())
{
    @Html.TextBox("message")
    <input type="submit" value="submit" />
}


[HttpGet]
public ActionResult Index()
{ return View(); }

[HttpPost]
public ActionResult Index(FormCollection form)
{
  ViewBag.Message = form["message"];
  return View();
}
20
naspinski

あなたが本当にそれを考えているかどうかはわかりません。クエリ文字列を削除すると...クエリ文字列が削除されます。つまり、ページには、必要な処理を実行するためのクエリ文字列値がありません。

あなたができるさまざまなハックがたくさんあります..それらのすべてが理想的ではありません。 javascriptを使用して、クエリ文字列を取り除くことができます。セッション変数を設定した後、クエリ文字列のないページにリダイレクトできます。それはすべてかなり醜いです。

ユーザーがアドレスバーに表示するのはクライアント上にあることを忘れないでください。クライアントがそれを制御します。 javascriptを介してそれをいじることができますが、そうすることは一般的に悪い考えです。ユーザーから物を隠すことはマルウェアのような振る舞いと見なすことができるからです。

1

routes を調べてください。これらは、パラメータを含むURLがどのように書き込まれるかを定義します。

新しいMVCアプリケーションを作成し、 `RegisterRoutes()の下にあるGlobal.asax.csファイルを確認する場合。 1つのエントリが表示されます。

routes.MapRoute(
   "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "home", action = "index", id = UrlParameter.Optional } // Parameter defaults
        );

各部分を見てください:

  • 「デフォルト」は名前です。これは、作成するルートごとに一意である必要があります。
  • 「{controller}/{action}/{id}」は使用したいパターンです。 example.org/home/index?id=2と書かれますexample.org/home/index/2代わりに
  • new {controller = "home"、action = "index"、id = UrlParameter.Optional}は、何も指定されていない場合のデフォルトを定義しています。

したがって、そのルートは、example.orgにアクセスすると、example.org/home/index {idはオプション}を意味すると想定されます。

そこから作業して、独自のルートを作成する方法を確認し始めることができます。

さて、あなたの質問に答える短い答えははいあなたはURLをそのように見せることができますが、実際には。デフォルトのメッセージを使用してルートを定義する必要があり、誰かがメッセージを指定しなかった場合にのみ、そのように見えます。メッセージが何であるかをコントローラーに伝える必要があります。申し訳ありませんが、あなたができる最善のことはあなたに与えるルートを定義することです

/message/Hello%20Worldそしてstring.replaceを使用すると、見栄えがさらに良くなります `'/ message/hello_world'

1
user60456

かみそりビューにJavaScriptを追加することで、クエリ文字列を削除できます。

@section scripts{
    <script>
        if (location.href.includes('?')) { 
            history.pushState({}, null, location.href.split('?')[0]); 
        }
    </script>    
}

ページに移動した場合

www.mysite.com/controller/?message=Hello%20world

次に表示されます

www.mysite.com/controller/

ブラウザで。

最近のほとんどのブラウザはこれをサポートしています( ブラウザサポート )。

0
Ohlin

ナメクジの使用をお勧めします。この投稿をチェックしてください: SOF Slug post 以前のアプリケーションでは、このアプローチを使用してURLからクエリ文字列を削除しました。

0
JoshYates1980