2013-03-20 6 views
6

पर आधारित विभिन्न एमवीसी 4 एक्शन यूआरएल में जीईटी चर के आधार पर विभिन्न कार्यों को कॉल करने के लिए एमवीसी 4 प्राप्त करने का कोई तरीका है?वैरिएबल

उदाहरण के लिए, मान लें कि मेरे पास निम्नलिखित दो कार्य हैं।

[HttpPost] 
public ActionResult SubmitCrash(CrashReport rawData) 
{ 
    return View(); 
} 


[HttpPost] 
public ActionResult SubmitBug(BugReport data) 
{ 
    return View(); 
} 

क्या कोई तरीका है कि मैं निम्नलिखित यूआरएल का उपयोग कर सकता हूं ताकि एमवीसी 4 'चुनने' को किस क्रिया को कॉल किया जा सके?

http://MySite/Submit?Crash (calls 'SubmitCrash') 
http://MySite/Submit?Bug (calls 'SubmitBug') 

अद्यतन:
मैं बहुत ज्यादा पता है कि मैं कार्रवाई का उपयोग कर सकते कर रहा हूँ/जिस तरह से वे कर रहे हैं, और यह भी हो (जो अब मैं क्या कर रहा हूँ) बनाने के लिए मार्ग के साथ चीजें करते यूआरएल, लेकिन मैं वास्तव में प्रश्न के जीईटी युद्ध भाग में रूचि रखता हूं।

+1

क्या आपके लिए http: // MySite/सबमिट/क्रैश 'विकल्प है? आप इसे कस्टम रूट टेबल एंट्री के साथ प्राप्त कर सकते हैं। –

+0

हाँ, मैं इसे अब कैसे करता हूं, लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है। –

उत्तर

2

यह रूप में साफ यह हो सकता है के रूप में नहीं है, लेकिन आप इस के लिए 'जड़' क्रिया का उपयोग हो सकता है:

public ActionResult Submit(string method) 
{ 
    return Redirect("Submit"+method); 
} 

public ActionResult SubmitCrash() 
{ 
    return View(); 
} 

public ActionResult SubmitBug() 
{ 
    return View(); 
} 

संपादित
मैं ActionNameAttribute का विस्तार अपनी जरूरतों को पूरा करने के लिए, तुम इतनी है यह लिख सकता है:

//handles http://MySite/Submit?method=Crash 
[ActionNameWithParameter(Name = "Submit", ParameterName = "method", ParameterValue = "Crash")] 
public ActionResult SubmitCrash() 
{ 
    return View(); 
} 

//handles http://MySite/Submit?method=Bug 
[ActionNameWithParameter(Name = "Submit", ParameterName = "method", ParameterValue = "Bug")] 
public ActionResult SubmitBug() 
{ 
    return View(); 
} 

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class ActionNameWithParameterAttribute : ActionNameSelectorAttribute 
{ 
    public string Name 
    { 
     get; 
     private set; 
    } 
    public string ParameterName 
    { 
     get; 
     private set; 
    } 
    public string ParameterValue 
    { 
     get; 
     private set; 
    } 
    public ActionNameAttribute(string name, string parameterName, string parameterValue) 
    { 
     if (string.IsNullOrEmpty(name)) 
     { 
      throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); 
     } 
     this.Name = name; 
     this.ParameterName = parameterName; 
     this.ParameterValue = parameterValue; 
    } 
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     return string.Equals(actionName, this.Name, StringComparison.OrdinalIgnoreCase) 
      && string.Equals(controllerContext.HttpContext.Request.QueryString.Get(ParameterName) 
       , this.ParameterValue 
       , StringComparison.OrdinalIgnoreCase); 
    } 
} 
+0

यह बहुत अच्छा है, और शब्दशः। मैं इस निष्कर्ष पर आ रहा हूं कि एमवीसी 4 में मेरे परिदृश्य को संभालने के लिए कोई रास्ता नहीं बनाया गया है? –

2

ऐसा करने के लिए मार्ग क्यों नहीं बनाते?

routes.MapRoute(
      name: "SubmitCrash", 
      url: "Submit/Crash", 
      defaults: new 
       { 
        Action = "SubmitCrash", 
        Controller = "NameOfController", 
       }); 

    routes.MapRoute(
      name: "SubmitBug", 
      url: "Submit/Bug", 
      defaults: new 
       { 
        Action = "SubmitBug", 
        Controller = "NameOfController", 
       }); 
संबंधित मुद्दे