public class MyOldClassicAspRouting : RouteBase
{
public override RouteData GetRouteData(HttpContextBase httpContext)
{
if (httpContext.Request.Headers == null) //for unittest
return null;
var queryString = httpContext.Request.QueryString;
//add your logic here based on querystring
RouteData routeData = new RouteData(this, new MvcRouteHandler());
routeData.Values.Add("controller", "...");
routeData.Values.Add("action", "...");
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
//Implement your formating Url formating here
return null;
}
}
そして、あなたのカスタムルーティングクラスを登録します。
別の解決策は、RouteBaseから派生してカスタムルーティングを足すにすることができ特定のアプリケーションロジック。
これは一般的なルートルールに記載されていない方が良いでしょう。
アクション引数にクエリ文字列の検出を次のように埋め込むことができます。
StepNoを処理するコントローラが1台ある方が良いと思います。
public class ABC : Controller
{
public ActionResult OpenCase(OpenCaseArguments arg)
{
// do stuff here
// use arg.StepNo, arg.Key and arg.Group as You need
return View();
}
}
public class OpenCaseArguments
{
private string _id;
public string id
{
get
{
return _id;
}
set
{
_id = value; // keep original value;
ParseQueryString(value);
}
}
public string StepNo { get; set; }
public string Key { get; set; }
public string Group { get; set; }
private void ParseQueryString(string qs)
{
var n = qs.IndexOf('?');
if (n < 0) return;
StepNo = qs.Substring(0, n); // extract the first part eg. {stepNo}
NameValueCollection parms = HttpUtility.ParseQueryString(qs.Substring(n + 1));
if (parms.Get("Key") != null) Key = parms.Get("Key");
if (parms.Get("Group") != null) Group = parms.Get("Group");
}
}
ModelBinderは、OpenCaseArgumentsのidフィールドに{id}値を割り当てます。 setメソッドはquerystring splitロジックを処理します。
このようにルーティングしてください。ルーティングはID引数でクエリ文字列を取得します。
routes.MapRoute(
"OpenCase",
"ABC/OpenCase/{id}",
new {controller = "ABC", action = "OpenCase"}
);
このメソッドを使用して、コントローラのアクションで複数のフィールドのキー値を取得しました。
MVCが自動的にクエリ文字列を 'QueryStringValueProvider'で解析することに注意してください。アクションメソッドでこれらの値を取得するために必要なのは、クエリメソッドの文字列キーと同じ名前のパラメーターをアクションメソッドまたはモデルに追加することだけです。このために独自のクエリ文字列パーサーを構築する必要はありません。 – NightOwl888