2009-11-07 27 views
5

के लिए सही नियंत्रक कोड मैं एक स्थिर साइट से एक नई गतिशील साइट तैयार कर रहा हूं। मेरे पास सभी मार्गों का मार्ग है लेकिन मेरे पास मेरी एक्शन विधि पर एक प्रश्न है।301 रीडायरेक्ट

नीचे कोड है, लेकिन फ़ायरबग की रिपोर्ट करने वाले शीर्षकों को जांचने और देखकर, अगर मैं प्रतिक्रिया लेता हूं। अंत में यह 302 रीडायरेक्ट है, मुझे लगता है कि मैंने 301 सेट किया है, लेकिन फिर एक और क्रिया को कॉल करें जो इसे 302 बनाता है , लेकिन अगर मैं Response.End में डाल मैं एक 301

मैं अनुमान लगा रहा हूँ कि Response.RedirectLocation वास्तव में 301 रीडायरेक्ट कर रहा है तो मैं इसलिए मेरी वापसी मान बदल सकता हूँ जोड़ने EmptyResult या अशक्त भी है कि लाइन के लिए मिलता है, हालांकि कोड का निष्पादन कभी नहीं किया जाएगा, इसलिए ऐप संकलित करता है?

public ActionResult MoveOld(string id) 
{ 
    string pagename = String.Empty; 

    if(id == "2") 
    { 
     pagename = WebPage.SingleOrDefault(x => x.ID == 5).URL; 
    } 

    Response.StatusCode = 301; 
    Response.StatusDescription = "301 Moved Permanently"; 
    Response.RedirectLocation = pagename; 
    Response.End(); 

    return RedirectToAction("Details", new { pageName = pagename }); 
} 
+0

जैसा कि मेरे उत्तर में टिप्पणियों में बताया गया है, आप वास्तव में यहां दो एक्शन रिसेट कर रहे हैं। 301 रीडायरेक्ट अपने आप में एक एक्शन रिसेट है, और उसके बाद आप इसका अनुसरण कर रहे हैं ** इसके बाद ** प्रतिक्रिया भेज दी गई है। –

उत्तर

14

मैं लेवी की टिप्पणियों को प्रतिबिंबित करता हूं। यह नियंत्रक का काम नहीं है। मैंने 301 के लिए this कस्टम एक्शन रिसेट का उपयोग करने का प्रयास किया है। नीचे अधिक विकल्पों के साथ एक संशोधित संस्करण है।

एएसपी.नेट एमवीसी v2 + के लिए, RedirectResult का उपयोग करें। कार्रवाई

//Just passing a url that is already known 
return new PermanentRedirectResult(url); 

//*or* 

//Redirect to a different controller/action 
return new PermanentRedirectResult(ControllerContext.RequestContext, "ActionName", "ControllerName"); 
+0

धन्यवाद लेकिन लेवी की तरह कहते हैं कि Response.End एक अपवाद फेंकता है, क्या यह वैध है? – Jon

+0

अपना कोड निष्पादित किए बिना, मुझे लगता है कि त्रुटि कुछ है 'HTTP शीर्षलेख भेजे जाने के बाद पुनर्निर्देशित नहीं किया जा सकता है'। ऐसा इसलिए है क्योंकि आप प्रतिक्रिया भेज रहे हैं, और फिर प्रतिक्रिया भेजने के बाद उपयोगकर्ता को रीडायरेक्ट कर रहे हैं। 'Response.End();' आखिरी चीज होनी चाहिए जो आप करते हैं। –

+0

ऐसा इसलिए है क्योंकि कोड नमूने में मैंने आपको दिया है, PermanentRedirectResult ** IS ** ActionResult है। असल में, आपके कोड में, आपके पास दो एक्शन रिसेट हैं। –

1

नियंत्रक 301 और अनुप्रेषित स्थान की स्थापना के लिए जिम्मेदार नहीं होना चाहिए। यह तर्क एक ActionResult के भीतर encapsulated किया जाना चाहिए, और नियंत्रक उस ActionResult का एक उदाहरण वापस करना चाहिए। ध्यान रखें कि विधि Response.End() वापस नहीं लौटाता है (यह अपवाद फेंकता है); जो लाइनें इसका पालन करती हैं वे निष्पादित नहीं होंगे।

0

MVC 2.0 से में

public class PermanentRedirectResult : ActionResult 
{ 
    public string Url { get; set; } 

    public PermanentRedirectResult(string url) 
    { 
    Url = url; 
    } 

    public PermanentRedirectResult(RequestContext context, string actionName, string controllerName) 
    { 
    UrlHelper urlHelper = new UrlHelper(context); 
    string url = urlHelper.Action(actionName, controllerName); 

    Url = url; 
    } 

    public PermanentRedirectResult(RequestContext context, string actionName, string controllerName, object values) 
    { 
    UrlHelper urlHelper = new UrlHelper(context); 
    string url = urlHelper.Action(actionName, controllerName, values); 

    Url = url; 
    } 

    public PermanentRedirectResult(RequestContext context, string actionName, string controllerName, RouteValueDictionary values) 
    { 
    UrlHelper urlHelper = new UrlHelper(context); 
    string url = urlHelper.Action(actionName, controllerName, values); 

    Url = url; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
    if (context == null) 
    { 
     throw new ArgumentNullException("context"); 
    } 
    context.HttpContext.Response.StatusCode = 301; 
    context.HttpContext.Response.RedirectLocation = Url; 
    context.HttpContext.Response.End(); 
    } 
} 

प्रयोग इस "RedirectResult" के लिए बनाया कार्रवाई परिणाम कक्षा में एक है। अधिक जानकारी के लिए इस पोस्ट का संदर्भ लें - MVC RedirectResult

संबंधित मुद्दे