विकल्प 1
बेशक
आप हमेशा की/कार/खोज /? विक्रेता = टोयोटा & रंग = लाल & मॉडल = रास्ता Corola और मुझे लगता है कि यह आप के लिए अच्छा होगा चुन सकते हैं ।
routes.MapRoute(
"CarSearch",
"car/search",
new { controller = "car", action = "search" }
);
आप इस मामले में अनुरोध में अनुरोध से पैराम प्राप्त कर सकते हैं।
विकल्प 2
या आप अनुमार्गण तालिका में पैरामीटर परिभाषित कर सकते हैं, लेकिन AFAIK यह, सभी संभव संयोजनों के लिए नियमों का एक सेट बनाने के लिए आवश्यक हो जाएगा क्योंकि पैरामीटर के आदेश बात है, उदाहरण के लिए:
routes.MapRoute(
"CarSearch1",
"car/search/vendor/{vendor}/color/{color}/model/{model}",
new {controller = "car", action = "search"}
);
routes.MapRoute(
"CarSearch2",
"car/search/color/{color}/vendor/{vendor}/model/{model}",
new {controller = "car", action = "search"}
);
routes.MapRoute(
"CarSearch3",
"car/search/model/{model}/color/{color}/vendor/{vendor}",
new {controller = "car", action = "search"}
);
... एक बहुत कुछ। यह सच है यदि आप मानक MvcRouteHandler के साथ जा रहे हैं।
किंतु ऐसा इस लिए एक आसान तरीके :)
विकल्प 3
मुश्किल है, लेकिन, मुझे लगता है, सबसे खूबसूरत तरीका है, अपने स्वयं के IRouteHandler कार्यान्वयन सुनिश्चित करने के लिए है - यह आप दे देंगे और अधिक पैराम क्रम में लचीलापन। लेकिन फिर, यह एक कठिन तरीका है, यदि आपके पास एक साधारण ऐप है तो इसके साथ न जाएं। तो, कितना यह इस तरह से (बहुत ही सरल उदाहरण) बनाने के लिए की उदाहरण के लिए:
routes.Add
(
new Route
(
"car/search/{*data}",
new RouteValueDictionary(new {controller = "car", action = "search", data = ""}),
new MyRouteHandler()
)
);
वर्गों है कि मानक अनुरोध संसाधन श्रृंखला ट्वीक करेगा जोड़ें:
मार्गों की सूची में नया मार्ग जोड़ें:
class MyRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MyHttpHandler(requestContext);
}
}
class MyHttpHandler : MvcHandler
{
public MyHttpHandler(RequestContext requestContext) : base(requestContext)
{
}
protected override void ProcessRequest(HttpContextBase httpContext)
{
IController controller = new CarController();
(controller as Controller).ActionInvoker = new MyActionInvoker();
controller.Execute(RequestContext);
}
}
class MyActionInvoker : ControllerActionInvoker
{
protected override ActionResult InvokeActionMethod(MethodInfo methodInfo, IDictionary<string, object> parameters)
{
// if form of model/{model}/color/{color}/vendor/{vendor}
var data = ControllerContext.RouteData.GetRequiredString("data");
var tokens = data.Split('/');
var searchParams = new Dictionary<string, string>();
for (var i = 0; i < tokens.Length; i++)
{
searchParams.Add(tokens[i], tokens[++i]);
}
parameters["searchParams"] = searchParams;
return base.InvokeActionMethod(methodInfo, parameters);
}
}
नियंत्रक में:
public ActionResult Search(IDictionary<string, string> searchParams)
{
ViewData.Add
(
// output 'model = Corola, color = red, vendor = Toyota'
"SearchParams",
string.Join(", ", searchParams.Select(pair => pair.Key + " = " + pair.Value).ToArray())
);
return View();
}
और यह होगा किसी भी खोज पैरामीटर आज़माना आदेश:
/car/search/vendor/Toyota/color/red/model/Corola
/car/search/color/red/model/Corola/vendor/Toyota
/car/search/model/Corola/color/red/vendor/Toyota
लेकिन भी एक लिंक पीढ़ी तर्क करना भूल जाते हैं न क्योंकि Html.ActionLink और Html.RenderLink आप की/कार/खोज/मॉडल/Corola सुंदर रूप में यूआरएल नहीं देंगे/रंग/लाल/विक्रेता/टोयोटा, तो आपको एक कस्टम लिंक जनरेटर बनाना होगा।
तो, यदि आपको वास्तव में लचीली रूटिंग की आवश्यकता है - तो आप बेहतर तरीके से इस कठिन तरीके से जाना चाहेंगे :)
से आते हैं, मुझे लगता है कि इस समय मेरी सबसे अच्छी कार्रवाई का विकल्प विकल्प 1 होगा। विकल्प 2 जिस तरह से मैंने शुरुआत में नेतृत्व किया था, लेकिन ऐसा लगता है कि सभी संभावित रूटिंग संयोजनों को रखना अक्षम है। विकल्प 3 बाद में अच्छा लगता है अगर मैं रिफैक्टर करना चाहता हूं, लेकिन एक एमवीसी एनओयूबी होने के नाते मैं आसान मार्ग के साथ रहूंगा। –
उत्कृष्ट जवाब! @Eric – AnthonyWJones
को अपनाने के लिए मत भूलना धन्यवाद, एंथनी :) – maxnk