2009-04-22 24 views
13

मुझे पता है, मुझे पता है, मुझे पता है। मुझे एमवीसी के अंदर वेबफॉर्म नहीं करना चाहिए, मैं पूरी तरह से सहमत हूं। लेकिन, जो लोग मेरे पेचेक पर हस्ताक्षर करते हैं वे हमारी साइट का पूर्ण रूपांतरण एमवीसी को अभी स्वीकृति नहीं देंगे। तो मैं एमवीसी में नई सुविधाओं को जोड़ने के दौरान उन्हें बदलने के लिए, पेज द्वारा पृष्ठ, पृष्ठ वृद्धि पृष्ठ ले रहा हूं।एएसपी.नेट एमवीसी - क्या अभी भी पोस्टपोस्ट है?

तो मेरा सवाल यह है कि मैं नियंत्रक से IsPostBack प्रॉपर्टी तक कैसे पहुंच सकता हूं?

संपादित करें: आगे स्पष्टीकरण के लिए, मेरे पास मेरे एमवीसी मास्टर पेज पर एक वेबफॉर्म उपयोगकर्ता नियंत्रण है जो पोस्टबैक शुरू कर सकता है। मैं इन पोस्टबैक छंदों को एक एमवीसी पोस्ट की पहचान करने की कोशिश कर रहा हूं। इस बिंदु पर मुझे लगता है कि मैं सिर्फ "__viewstate" कुंजी के लिए अनुरोध फ़ॉर्म कुंजी की जांच करने जा रहा हूं और यदि इसे पाया गया तो इसे एक पोस्टबैक के रूप में माना जाता है।

+0

'सार्वजनिक स्थैतिक bool IsPostBack (इस HttpRequestBase अनुरोध) {वापसी __viewstate-something-something} 'शायद आपको सबसे नज़दीकी मिल जाएगा। लेकिन एमवीसी मास्टर पेजों में वेब फॉर्म उपयोगकर्ता नियंत्रण रखने से एएसपी.नेट एमवीसी के भविष्य के संस्करणों में तोड़ सकता है। – bzlm

+0

हम एमवीसी के अंदर वेब फॉर्म का उपयोग क्यों नहीं करना चाहिए? मैं वेब फॉर्म का उपयोग कर रहा हूँ। लेकिन मैं पेशेवर नहीं हूँ। वेब फॉर्म के अलावा हम और क्या उपयोग कर सकते हैं? –

उत्तर

3

नियंत्रक System.Web.UI.Page से प्राप्त नहीं होते हैं। पोस्टस्टॉप संपत्ति नहीं है।

+1

एएसपी.नेट देखें इंजन दृश्य पृष्ठ से प्राप्त होते हैं। –

+2

मैं सही खड़ा हूँ। विचार करते हैं। नियंत्रक नहीं करते हैं। –

0

एमवीसी ढांचा क्लासिक पोस्टबैक और वेब फॉर्म में उपयोग किए जाने वाले व्यूस्टेट का समर्थन नहीं करता है। तो, नहीं, आपके पास IsPostBack तक पहुंच नहीं है।

मेरी सलाह है कि आप दो शाखाएं हों: एक वर्तमान साइट के साथ जहां आप ज्ञात त्रुटियों के लिए पैच जोड़ रहे हैं और दूसरा जहां आप स्क्रैच से एक नई साइट बनाते हैं। इस में नई सुविधाओं को लागू किया जाना चाहिए। मुझे लगता है कि आपकी अधिकांश कोडबेस नई साइट पर पुनः उपयोग करने योग्य है।

जब नई साइट तैयार हो, तो इसे उत्पादन में रखें।

13

कोई IsPostBack नहीं है - सब कुछ या तो पोस्ट या GET (या अन्य HTTP क्रिया) है। आप HTTP क्रियाओं को सीमित कर सकते हैं जो आपकी क्रिया की अनुमति देता है, यानी, आप AcceptVerbsAttribute का उपयोग करके किसी अस्वीकृत क्रिया से कभी भी अनुरोध नहीं देखेंगे। उदाहरण के लिए, निम्नलिखित केवल POSTs को अनुमति देता है।

[AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult Update(int id) 
    { 
    } 

आप समान कार्रवाई नाम दोनों मिलता है की आवश्यकता है/पोस्ट और वे वास्तव में अलग अलग चीजें हैं, आप उन्हें अलग हस्ताक्षर दे सकते हैं या तो या क्रियाओं में से एक अन्य नाम पर इतना तरीकों हो सकता है ActionNameAttribute का उपयोग अलग-अलग नाम

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult List() 
    { 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult List(string filter, int page, int limit) 
    { 
    } 

या

[ActionName("List")] 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult ListDisplay() 
    { 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult List() 
    { 
    } 

संपादित: ध्यान दें कि मैं पोस्ट कार्रवाई करने के antiforgery टोकन सत्यापन जोड़ दिया है। आपको वास्तव में इसका उपयोग protect against cross-site scripting attacks पर करना चाहिए।

+0

वास्तव में एमवीसी और वेबफॉर्म पृष्ठों को मिलाते समय भी पोस्ट बैक हैं। ऊपर मेरा संपादन देखें। – chief7

0

आप उस मान को नियंत्रक के भीतर से क्यों प्राप्त करने का प्रयास कर रहे हैं? सुनिश्चित नहीं है कि यह आपकी मदद करेगा, लेकिन आप अभी भी एक फॉर्म द्वारा सबमिट की गई जानकारी प्राप्त करने के लिए पारंपरिक अनुरोध ऑब्जेक्ट का उपयोग कर सकते हैं ...

0

मुझे यकीन नहीं है कि मैं आपका प्रश्न सही ढंग से समझ गया हूं, लेकिन नियंत्रक पर एक ऐसी क्रिया होगी जो ब्राउज़र से शुरुआती जीईटी को संभालेगी और POST को संभालने के लिए दूसरी कार्रवाई करेगी।

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(MyModel model) 
{...} 

public ActionResult Create() 
{...} 
0

मैं निश्चित रूप से स्कॉट हंसेलमैन द्वारा इस ब्लॉग पोस्ट को देखता हूं जहां वह एक एमवीसी अनुप्रयोग में एएसपीएक्स पेज डालता है।

http://www.hanselman.com/blog/PlugInHybridsASPNETWebFormsAndASPMVCAndASPNETDynamicDataSideBySide.aspx

आपका नियंत्रकों ViewState संपत्ति के लिए पहुँच नहीं होगा।यहां तक ​​कि यदि आप __VIEWSTATE की समस्या को संभालना चाहते हैं, तो आपको इसे एक एमवीसी नियंत्रक में उपयोग करने योग्य फ़ॉर्म में लाने के लिए कुछ काम करना होगा। एक रूपांतरण रणनीति के साथ आने पर शुभकामनाएं, इससे कोई फर्क नहीं पड़ता कि यह कितने लोगों को काम करता है, इस प्रक्रिया में आपको किस तरह की समस्याओं का सामना करना पड़ेगा।

32

मामले में किसी को अब भी रुचि रखता है, तो आप इस तरह एक MVC कार्रवाई विधि के अंदर से एक पोस्ट के लिए परीक्षण कर सकते हैं:

if (Request.HttpMethod=="POST") { 

} 
+0

इसके लिए धन्यवाद, एमवीसी में आपको यह करने का सही तरीका है! –

+2

इसे सभी लागतों से बचाएं। आपके नियंत्रक कोड विधियों द्वारा व्यवस्थित किया जाना चाहिए। आपकी HttpGet विधि यानी [HttpGet] आपकी [HttpPost] विधि से पूरी तरह से अलग होना चाहिए। इसके लिए कई कारण हैं, टेस्टेबिलिटी एक, पठनीयता आदि है। नीचे tvanfosson का जवाब देखें। –

+1

2012 +1 में अभी भी उपयोगी है –

0

आप एक MVC पेज में एक से अधिक फार्म है, तो आप जोड़ सकते हैं एक छिपा हुआ एक सार्थक आईडी के साथ फॉर्म के भीतर इनपुट और यदि उसके पास मूल्य है तो परीक्षण करें। इस तरह आपको दो अलग हैंडलर (एक पाने के लिए और पोस्ट के लिए एक) की आवश्यकता नहीं है।

तो पेज inf और फार्म के अंदर:

<input type="hidden" id="testForm" name="testForm" value="1"/> 

और नियंत्रक में:

if (Request.Form["testForm"] != null) 
     { 
     // ACTIONS FOR THE POSTED FORM 
     } 

आशा है कि यह मदद करता है!

7

आप उस्तरा में कोड के इस टुकड़े का उपयोग कर सकते

@if(IsPost) 
{ 
//dosomething 
} 
else 
{ 
//do some other thing 
} 
3

मैं अक्सर इस विधि का उपयोग (मेरी BaseController वर्ग पर घोषित)

protected bool IsPostBack() 
{ 
    bool isPost = string.Compare(Request.HttpMethod, "POST", 
     StringComparison.CurrentCultureIgnoreCase) == 0; 
    if (Request.UrlReferrer == null) return false; 

    bool isSameUrl = string.Compare(Request.Url.AbsolutePath, 
     Request.UrlReferrer.AbsolutePath, 
     StringComparison.CurrentCultureIgnoreCase) == 0; 

    return isPost && isSameUrl; 
} 
संबंधित मुद्दे