2016-09-23 7 views
1

は、私たちすべてが、常にexample.com/controller/action?param1=value1&param2=value2ASP.NET MVC 5のQueryStringでActionNameを設定する方法はありますか?

私はちょうど example.com/controller?aciton=index&param1=value1&param2=value2(予告クエリ文字列に アクション=インデックス)のようなクエリ文字列にアクション名を入れる方法がある知っているように思い

ようにASP.NET MVCでURLを知っていますASP.NET MVCがurlを対応するコントローラとアクションにルーティングするようにします。クエリ名の名前はactionなどです。

--- 9月28日を更新---
私は、フォーム内で、フォームを持っている実態が(など、削除、編集、作成した各列と、いくつかのボタンのラジオボタンを持つテーブルであります)。これらのボタンは、同じコントローラーで異なるアクションに移動します。

検索の結果、私はいくつかのソリューションを持っている:

  1. ではJavaScript経由でのonSubmit処理し、フォームのactionプロパティを変更します。 Answer link
  2. コントローラに「ルート」メソッドを書き込んでリクエストを再ルーティングします。 Answer link(これは優雅な解決策ではないと思います)
  3. カスタム属性を書き込むと、ASP.NET MVCがクエリの対応するアクションベースにルーティングされます。 This anwserthis answer(私のオリジナルのアイデアに非常に近い、私は現在、このソリューションを使用しています)
+0

私は、ルート設定で遊んでいることをお勧めします。ルーティングを経由して直接実行できない場合は、 'action'パラメータを評価し、指定されたアクションにリダイレクトする 'ハンドラ'アクションへのルートにすることができます。十分にシンプルにする必要があります – musefan

+0

一般的に、ルートconfig内のルートはクエリ文字列では設定できません。それをやろうとすると、エラーが発生します。ルーティングの主な慣習を乗り越える方法があるかどうかはわかりません。あなたがこれをしたいと思う理由はありますか?それはMVCの慣習を冗長にします。 – Luke

+2

ルートコンフィグレーションでクエリ文字列を設定する必要はありません。また、クエリ文字列をチェックし、クエリ文字列名と一致するパラメータ名があると仮定して、アクションパラメータにマッピングします –

答えて

0

私は質問者だと私は質問を更新するだけで、数時間後、私は最終的に解決策を見つけ出します。それはカスタムルートを書くことです。

public class QueryActionRoute : Route 
{ 
    public QueryActionRoute(string url, object defaults) : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler()) { } 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var routeData = base.GetRouteData(httpContext); 
     var action = httpContext.Request["action"]; 
     if (routeData != null) 
     { 
      if (!string.IsNullOrEmpty(action)) 
      { 
       routeData.Values["action"] = action; 
      } 
     } 
     else 
     { 
      routeData = new RouteData() 
      { 
       Values = { {"action", "Index"} } 
      }; 
     } 
     return routeData; 
    } 
} 

、あなたが経由でアクションにアクセスすることができ、その後デフォルトルート

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.Add(
      "Default", 
      new QueryActionRoute(
       "{controller}/{action}/{id}", 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional })); 
    } 
} 

を交換
example.com/home/about?param=value
または
のように(アクションが「インデックス」である場合は、アクション名を発することができます) example.com/home?action=about&param=value

フォームでさまざまな操作を行うために異なるボタンを指定する必要があるときは、本当に役に立ちます。この方法でそれを作ることができます:

<form action="@Url.Action("Index")"> 
    <button name="action" value="Create">Create</button> 
    <button name="action" value="Details">Detail</button> 
    <button name="action" value="Edit">Edit</button> 
    <button name="action" value="Delete">Delete</button> 
</form>