2012-03-12 8 views
11

が、私はこのようになりますアクションメソッドを持つアクションメソッドでのクエリ文字列を削除します。ASP.NET MVCは

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

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

何が起こるかというとこれに対する要求のURLは次のようになりますということです

しかし、私はそれがactionmethod内部のクエリ文字列を削除する方法はただ

www.mysite.com/controller/ 

あります見てみたいですか?

+0

あなたはクエリ文字列を入力しないと、デフォルトのメッセージが必要だと言っていますか?または、最初にURLに送信されたメッセージのタイプに関係なく、クエリ文字列を隠したいと思っていますか? –

+0

2番目のメッセージは、基本的にメッセージを処理したい(何でもかまいません)URLに表示しません。 – willvv

答えて

15

いいえ、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(); 
} 
+1

うん、ちょうど私が思った。私は似たようなやってしまった:\t \t \t \t場合 \t \t \t \t { \t \t \t \t \t TempDataを[ "メッセージ"] =メッセージ(メッセージを= nullを!) \t \t \t \t \t return RedirectToAction( "Index"); \t \t \t \t} \t \t \t \t IF(TempData.ContainsKey( "メッセージ")) \t \t \t \t { \t \t \t \t \t ViewBag.Message = TempDataを[ "メッセージ"]。 \t \t \t \t \t TempData.Remove( "Message"); \t \t \t \t}これは基本的にメッセージを保存し、パラメータなしで同じアクションメソッドをリロードします。 – willvv

+0

これはまだ最高のソリューションですか?私は特定の時間にのみページを表示していますが、モデルを取りますが、このアクションは公にアクセスできず、/ Registration/AfterHours/Registration/AfterHoursのようなかなりのURLを持ってほしいですか?DateTime ... [クレイジーな文字]。それにかかわらず、これは動作します。 –

2

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

あなたができるさまざまなハッキングがあります。それらのすべてが理想的ではありません。あなたは、クエリ文字列を取り除くために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/home/index{idはオプション}であることを意味と仮定しますので、あなたがexample.orgに行けばそれを作ります。

これから、独自のルートを作成する方法を見てみることができます。

は今、あなたの質問に対処することは、短い答えは、URLがそのように見えるように、本当にませんでしたyesです。デフォルトのメッセージでルートを定義する必要があります。誰かがメッセージを指定しなかった場合にのみ、そのように見えます。コントローラにメッセージが何であるかを伝える必要があります。申し訳ありませんが、できることは、あなたに与える経路を定義することです。

/message/Hello%20Worldと文字列を使用してください。``/message/hello_world ''のように見えるものを置き換えてください。

+0

彼はフレンドリーなパラメータを追加しようとしていませんが、何とかクエリーストリング値を持っていますが、URLにはそれをまったく表示したくありません。 –

+0

あなたが私の答えを全部読んだら、私はそのことに気付くでしょう – Joe

0

スラッグの使用をお勧めします。この記事をチェックしてください:SOF Slug post 以前のアプリケーションでは、URLからクエリーストリングを削除するためにこの方法を採用しました。