2011-06-25 19 views
12

के बीच भ्रम मैं एमएस प्रमाणपत्र (70-515) के लिए अध्ययन कर रहा हूं।
मैं ऑनलाइन जो खोजता हूं और जो मैंने अभ्यास अभ्यास में पढ़ा है उससे उलझन में हूं।
SO राज्य पर कुछ प्रश्न हैं कि एक RedirectToAction का उपयोग ब्राउज़र को 302 भेज रहा है, इस प्रकार यह पता बार में अपना यूआरएल बदल सकता है।रीडायरेक्ट और रीडायरेक्ट टॉक्शन

लेकिन इस अभ्यास परीक्षण के 1 से एक सवाल यह है:

प्रश्न:

MVC होम नियंत्रक वर्तमान में केवल डिफ़ॉल्ट सूचकांक कार्रवाई है। प्रासंगिक कोड निम्नलिखित कोड उदाहरण में दिखाया गया है।

public ActionResult Index() 
{ 
    ViewData["Message"] = "Hello!"; 
    return View(); 
} 

आप FindID नामक एक कार्रवाई है कि आईडी पैरामीटर पथ के भाग के रूप में प्रवेश किया प्रदर्शित करता है बनाने के लिए की जरूरत है। यदि पथ में आईडी पैरामीटर शामिल नहीं है, तो ASP.NET को ब्राउज़र के पता बार में यूआरएल को बदले बिना इंडेक्स एक्शन को संसाधित करना होगा, और अपवाद फेंकना नहीं चाहिए। आप किस कोड सेगमेंट का उपयोग करना चाहिए?

सही जवाब:

public ActionResult FindID(int? id) 
{ 
    if (!id.HasValue) 
     return RedirectToAction("Index"); 
    ViewData["Message"] = "ID is " + id.ToString(); 
    return View(); 
} 

व्याख्या:

आप ActionResult की RedirectToAction फार्म का उपयोग कर सकते हैं MVC एक कार्रवाई के भीतर से एक अलग कार्रवाई कार्रवाई करने के लिए पैदा करने के लिए। एमवीसी वर्तमान कार्रवाई को त्याग देता है और अनुरोध को संसाधित करता है जैसे कि मार्ग सीधे आपके द्वारा रीडायरेक्ट की गई कार्रवाई के लिए नेतृत्व किया था। अनिवार्य रूप से, यह सर्वर को कॉल करने के बराबर है। मानक एएसपी.NET अनुप्रयोग में ट्रांसफर करें।

रीडायरेक्ट एक्शन रिसेट ब्राउज़र पर "HTTP त्रुटि 302 - मिली" प्रतिक्रिया भेजता है, जो ब्राउज़र को निर्दिष्ट यूआरएल लोड करने का कारण बनता है। यह पता बार में दिखाई देने वाला पता बदलता है।

तो:
- एक RedirectToAction ब्राउज़र में URL अछूता छोड़ करता है?
- क्या रीडायरेक्ट ब्राउज़र में यूआरएल बदलता है?
- क्या अभ्यास परीक्षा का स्पष्टीकरण सही है? कि से मैं समझता हूँ कि RedirectToAction नहीं करता है एक 302.

+1

ठीक है, तो ऐसा लगता है कि प्रमाणीकरण अभ्यास परीक्षण में जो लिखा गया है वह गलत है (भयानक!)। कोई सही जवाब उपलब्ध नहीं था। मुझे आश्चर्य है कि अगर मुझे परीक्षा में बिल्कुल सही सवाल मिलता है तो मुझे क्या करना चाहिए। मुझे लगता है कि मैं वही जवाब दूंगा जैसा अब परीक्षण में सही है। – TweeZz

उत्तर

9

आप ActionResult की RedirectToAction फार्म का उपयोग कर सकते हैं MVC एक कार्रवाई के भीतर से एक अलग कार्रवाई कार्रवाई करने के लिए पैदा करने के लिए। एमवीसी वर्तमान कार्रवाई को त्याग देता है और अनुरोध को संसाधित करता है जैसे कि मार्ग सीधे आपके द्वारा रीडायरेक्ट की गई कार्रवाई के लिए नेतृत्व किया था। अनिवार्य रूप से, यह सर्वर को कॉल करने के बराबर है। मानक एएसपी.NET अनुप्रयोग में ट्रांसफर करें।

यह गलत है।

दोनों RedirectToRouteResult (RedirectToAction) और RedirectResult दोनों 302 रीडायरेक्ट करते हैं, जिसके परिणामस्वरूप ब्राउजर में यूआरएल बदलता है।

यूआरएल कोड वास्तव में होगा बदले बिना सूचकांक परिणाम लौटने के लिए:

public ActionResult FindID(int? id) 
{ 
    if (!id.HasValue) 
     return View("index"); 
    ViewData["Message"] = "ID is " + id.ToString(); 
    return View(); 
} 

हालांकि, मैं इस दृष्टिकोण की सिफारिश नहीं होगा। अगर मैं mysite.com/products/some-product और some-product का अनुरोध नहीं करता हूं, तो मुझे उस उपयोगकर्ता को प्रासंगिक स्थिति कोड (खोज इंजन के लिए भी महत्वपूर्ण) के साथ सूचित करना चाहिए।

यदि आपकी FindID कार्रवाई का एकमात्र उद्देश्य आईडी पैरामीटर के साथ कुछ करना है, तो यह शून्य/वैकल्पिक नहीं होना चाहिए। इस प्रकार कोई आईडी निर्दिष्ट नहीं होने पर FindID कार्रवाई नहीं की जाएगी।

+1

यदि RedirectToAction! = सर्वर। ट्रांसफर, तो आप सर्वर कैसे करेंगे। एमवीसी में ट्रांसफर करें? – TweeZz

+0

@ ट्वीज: आपको स्थानांतरण करने की आवश्यकता नहीं है क्योंकि आप अभी तक दृश्य में नहीं हैं। आप एक अलग दृश्य का उपयोग करने के लिए नियंत्रक से एक अलग ActionResult वापस आते हैं। – Guffa

+0

ठीक है, इतनी लंबी कहानी छोटी है: रीडायरेक्ट टॉक्शन और रीडायरेक्ट दोनों 302 करते हैं, रीडायरेक्ट टॉक्शन आपको बस एक पूर्ण यूआरएल नहीं लिखने की अनुमति देता है, लेकिन एक क्रिया निर्दिष्ट करने के लिए। आंतरिक रूप से यह वही है। सही? – TweeZz

9

RedirectToAction विधि के लिए दस्तावेज़ हमें बताता है कि यह एक 302 प्रतिक्रिया भेज करता है:

"रिटर्न ब्राउज़र है, जो निर्दिष्ट कार्रवाई के लिए एक GET अनुरोध करने के लिए ब्राउज़र का कारण बनता है के लिए एक HTTP 302 प्रतिक्रिया। "

dll में कोड की जांच करना है कि यह एक RedirectToRouteResult वस्तु है, जो एक रीडायरेक्ट का कारण बनता है वापसी करता है का पता चलता है, तो प्रलेखन सही है:

protected internal virtual RedirectToRouteResult RedirectToAction(string actionName, string controllerName, RouteValueDictionary routeValues) { 
    RouteValueDictionary routeValueDictionaries; 
    if (this.RouteData == null) { 
    routeValueDictionaries = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, null, routeValues, true); 
    } else { 
    routeValueDictionaries = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, this.RouteData.Values, routeValues, true); 
    } 
    return new RedirectToRouteResult(routeValueDictionaries); 
} 

परीक्षण सवाल का सही जवाब का उपयोग किया जाएगा एक अलग दृष्टिकोण:

public ActionResult FindID(int? id) { 
    if (!id.HasValue) { 
    ViewData["Message"] = "Hello!"; 
    return View("Index"); 
    } 
    ViewData["Message"] = "ID is " + id.ToString(); 
    return View(); 
} 

यह दृश्य FindID कि parameterless कॉल द्वारा दिया जाता है, के बजाय दृश्य Index का उपयोग करेगा View()

+1

मुझे यह पूरी चीज उबर उलझन में मिलती है :( – TweeZz

+1

Pitty मैं 2 उत्तरों को सही के रूप में चिह्नित नहीं कर सकता .. – TweeZz

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