2011-08-11 3 views
0

は、私はシンプルコントローラ持っているビューの.Net MVC3にdisappeare:Global.asaxの中ルート値は

<h2>@ViewContext.RouteData.Values["r"]</h2> 
     @using (Html.BeginForm("Test", "Test")) 
     { 
      <input type="text" name="r" /> 
      <button>Submit</button> 
     } 

私が持っているルートルール:

public class TestController : Controller 
    { 
     public ActionResult Test(string r) 
     { 
      return View(); 
     } 

    } 

を私は、単純なビューTest.cshtml持っています

routes.MapRoute(
      null, 
      "Test/{r}", 
      new { action = "Test", controller = "Test", 
       r = UrlParameter.Optional } 
     ); 

私はこのようなことをしたい:ユーザ入力のルート値を入力し、submitを押すと、コントローラがTest/valueページにリダイレクトする。しかしコントローラは毎回Testという名前のページを表示します。 ViewContext.RouteData.Values ["r"]も空です。私はデバッグをチェックし、テストアクションはrのユーザー値を正しく受け取ります。 私の考えをどうすれば実現できますか?おかげさまで

答えて

0

これはjavascriptなしでは実行できません。 <form>を送信する際に存在するメソッドには、GETとPOSTの2種類があります。 POST(デフォルト)を使用すると、フォームはURLにPOSTされますが、入力フィールドに入力されたすべてのデータはPOST本体の一部なので、URLの一部ではありません。 GETを使用すると、入力フィールドのデータはクエリ文字列の一部ですが、形式は/Test?r=somevalueです。

私はパスの一部として、ユーザー入力を送信しようとあなたをお勧めしませんが、あなたはそのルートを行くことに決める場合は、フォームの提出イベントをサブスクライブしてURLを書き換えることができます:

$('form').submit(function() { 
    var data = $('input[name="r"]', this).val(); 
    window.location.href = this.action + '/' + encodeURIComponent(data); 
    return false; 
}); 
+0

ああ!確かに!ありがとう。 2つのアクションメソッド(HttpGetとHttpPost)を作成し、HttpPostメソッドからHttpGetメソッドへのRedirectToActionを使用します。それはうまく動作します。ありがとう! – greatromul

0

フォームをHtml.BeginForm("Test", "Test")に投稿すると、同じページに常にポストバックされます。

ソリューションは、(ビュー)「RedirectToAction」を使用してアクションに明示的なリダイレクトを使用することができたり、フォームのアクションを変更するためにJavaScriptを使用することができます。

<input type="text" name="r" onchange="this.parent.action = '\/Test\/'+this.value"/> 
1

私はパーティーにスーパー遅刻しますしかし、ちょうど参考のために解決策を掲載したいと思っていました。このフォームには、それが入力されたときと同じくらい強いと思われます。他の入力があると仮定すると、フォームの入力をTestModelというモデルのクラスにまとめることができ、そのプロパティはフォームの入力のIDに対応します。

私たちの記事では、getにリダイレクトして、URLに必要なルート値を渡します。それ以外のデータは、TempDataを使用してgetにシャトルすることができます。

public class TestController : Controller 
    { 
     [HttpGet] 
     public ActionResult Test(string r) 
     { 
      TestModel model = TempData["TestModel"] as TestModel; 
      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Test(string r,TestModel model) //some strongly typed class to contain form inputs 
     { 
      TempData["TestModel"] = model; //pass any other form inputs to the other action 
      return RedirectToAction("Test", new{r = r}); //preserve route value 
     } 

    } 
関連する問題