2012-07-04 19 views
14

मुझे पूरा यकीन है कि मैं यहां कुछ गलत कर रहा हूं। पिछले 2 महीनों में हम एमवीसी और रेजर का उपयोग करके एक वेब ऐप विकसित कर रहे हैं और हमने कभी भी फॉर्म तत्व का उपयोग करने के बारे में सोचा नहीं है। अब मास्टर पेज और उप पृष्ठों के साथ पहले से ही बहुत कुछ किया जा चुका है जिसका अर्थ है कि फॉर्म तत्व का उपयोग करने के लिए हमारे अधिकांश कोड को पुनर्गठन करना और परिणामस्वरूप पृष्ठ पर कई फॉर्म तत्व होंगे।एमवीसी रेजर छिपी हुई इनपुट और गुजरने वाले मूल्य

उस तरफ, Asp.Net में अगर मैं सी # कोड में किसी भी नियंत्रण तक पहुंचना चाहता हूं तो मैं इसे केवल एक आईडी = "कुछ आईडी" और एक रनैट = "सर्वर" दे सकता हूं। फिर मेरे कोड में पीछे मैं अपना मूल्य और गुण निर्धारित कर सकता था।

<input id="hiddenPostBack" runat="server" type="hidden" /> 

क्यों मैं नियंत्रक में इस का उपयोग नहीं कर सकते हैं:

जब मैं उस्तरा में ऐसा करते हैं, हम की तरह लाइनों का उपयोग करें? मैं एक पोस्टबैक का पता लगाना चाहता हूं और मान को गलत पर सेट करना चाहता हूं यदि यह पहली बार पृष्ठ लोड होता है, और यदि नहीं, तो मान को सत्य पर सेट करें। फिर इसके आधार पर, मैं इसे सर्वर साइड या क्लाइंट साइड पढ़ूंगा और कुछ करूँगा।

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

आपकी मदद के लिए अग्रिम धन्यवाद।

+0

एमवीसी में कोई प्रबंधित "पोस्टबैक" नहीं है। आपको क्लाइंट साइड पर कार्रवाइयां प्रबंधित करने के लिए जावास्क्रिप्ट का उपयोग करने की आवश्यकता है ... –

उत्तर

31

वेबफॉर्म से एमवीसी के लिए एक कदम तर्क और मस्तिष्क प्रक्रियाओं में एक पूर्ण समुद्र परिवर्तन की आवश्यकता है। अब आप 'फॉर्म' दोनों सर्वर-साइड और क्लाइंट-साइड (और वास्तव में वेबफॉर्म के साथ भी आप क्लाइंट-साइड पर बातचीत नहीं कर रहे थे) के साथ बातचीत कर रहे हैं। आपने शायद वेबफॉर्म और RUNAT="SERVER" के साथ बस कुछ सोच को मिश्रित किया है, आप केवल वेब पेज के बिल्डिंग के साथ बातचीत कर रहे थे।

एमवीसी कुछ हद तक समान है कि आपके पास मॉडल बनाने के लिए सर्वर-साइड कोड है (डेटा जिसे आप बनाने के लिए आवश्यक डेटा बनाना चाहते हैं), लेकिन एक बार जब आप HTML बनाते हैं तो आपको इसकी सराहना करने की आवश्यकता होती है कि इसके बीच का लिंक सर्वर और उपयोगकर्ता अब मौजूद नहीं है। उनके पास HTML का एक पृष्ठ है, यही वह है।

तो आप जो HTML बना रहे हैं वह केवल पढ़ने के लिए है। आप मॉडल को रेजर पेज से पास करते हैं, जो उस मॉडल के लिए उपयुक्त एचटीएमएल का निर्माण करेगा।

यदि आप एक छिपी हुई तत्व चाहते हैं जो इस पर निर्भर करता है कि यह पहला दृश्य है या नहीं, तो आपको अपने मॉडल में एक बूल की आवश्यकता है, और इसे क्रिया में सही पर सेट करें यदि यह किसी अनुवर्ती प्रतिक्रिया के जवाब में है अप। यह अनुरोध है कि अनुरोध [HttpGet] या [HttpPost] है (यदि यह आपके फॉर्म को सेट अप करने के लिए उचित है: पहली बार यात्रा के लिए अनुरोध प्राप्त करें और फॉर्म सबमिट करते समय POST अनुरोध) के आधार पर अलग-अलग कार्रवाइयां करके किया जा सकता है।

वैकल्पिक मॉडल सही पर सेट किया जा सकता है जब यह बनाया (जो आप पृष्ठ पर जाएँ पहली बार हो जाएगा), लेकिन के बाद आप गलत पर एक bool चूक के बाद से सही है या गलत (किया जा रहा है जब यह है के रूप में मान की जाँच instantiated)। फिर उपयोग:

@Html.HiddenFor(x => x.HiddenPostBack) 

आपके रूप में, जो एक छिपी हुई सत्य रखेगा। जब फ़ॉर्म को आपके सर्वर पर वापस पोस्ट किया जाता है तो मॉडल के पास अब उस मान को सही पर सेट किया जाएगा।

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

+2

मैं सहमत हूं, मुझे एक अच्छी किताब चाहिए। हालांकि हम पहली रिलीज में हैं और सिर्फ दरवाजे के रूप में कुछ हासिल करना चाहते हैं, जैसा कि समझाया गया है, पृष्ठों को सही तरीके से उपयोग करने के लिए पृष्ठों को फिर से लिखना इस समय व्यावहारिक नहीं है, लेकिन बाद में यह निश्चित होगा। जो आपने सुझाया है उससे कुछ बेहतर है जो मैंने कुछ डिग्री देखा है, लेकिन यह अभी भी एक दृश्य पृष्ठ पर प्रत्येक नियंत्रण के लिए मॉडल और नियंत्रक/actionresult का दृष्टिकोण लेता है। मैं ड्रॉप डाउन कॉम्बो बॉक्स का उपयोग करके वापस पोस्ट कर रहा हूं और चेक बॉक्स या रेडियो, और कभी-कभी बटन की घटनाओं पर क्लिक कर रहा हूं। लेकिन जावास्क्रिप्ट पुनर्निर्देशन को संभालता है। आपके सुझावों के लिए धन्यवाद। –

0

सबसे पहले एएसपी.नेट एमवीसी वेबफॉर्म करता है वैसे ही काम नहीं करता है। आपके पास पूरी runat="server" चीज़ नहीं है। एमवीसी वेबफॉर्म की पेशकश की गई अमूर्त परत की पेशकश नहीं करता है। Probabaly आपको समझने की कोशिश करनी चाहिए कि नियंत्रक और कार्य क्या हैं और फिर आपको मॉडल बाध्यकारी देखना चाहिए। एमवीसी के बारे में कोई भी शुरुआती स्तर ट्यूटोरियल दिखाता है कि आप क्लाइंट और सर्वर के बीच डेटा कैसे पारित कर सकते हैं।

+0

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

+0

आप वास्तव में कर सकते हैं, लेकिन क्या आपने देखा है कि इस तरह के फॉर्म अब और कोड नहीं हैं। :-) (समझने योग्य के रूप में नियंत्रक पीछे नया कोड है)। आपके उत्तर के लिए धन्यवाद। –

-1

आप इसे गलत कर रहे हैं क्योंकि आप एमवीसी अनुप्रयोग में वेबफॉर्म को मैप करने का प्रयास करते हैं।

एमवीसी में कोई सर्वर साइड कंट्रोल नहीं है। बैक एंड पर केवल एचटीएमएल (देखें) और नियंत्रक। आप सर्वर से क्लाइंट को द्वारा अपने मॉडल के साथ व्यू के प्रारंभ के माध्यम से डेटा भेजते हैं।

यह आपके संसाधन के HTTP HTTP अनुरोध पर हो रहा है।

[HttpGet] 
public ActionResult Home() 
{ 
    var model = new HomeModel { Greeatings = "Hi" }; 
    return View(model); 
} 

आप सर्वर से डेटा पोस्टिंग के माध्यम से सर्वर के लिए ग्राहक से डेटा भेजने। ऐसा करने के लिए, आप अपने कंट्रोलर में अपने व्यू और [एचटीपीपोस्ट] हैंडलर के अंदर एक फॉर्म बनाते हैं।

// View 

@using (Html.BeginForm()) { 
    @Htmt.TextBoxFor(m => m.Name) 
    @Html.TextBoxFor(m => m.Password) 
} 

// Constoller 

[HttpPost] 
public ActionResult Home(LoginModel model) 
{ 
    // do auth.. and stuff 
    return Redirect(); 
} 
1

आप पहले से ही लगा सकते हैं, Asp.Net MVC Asp.Net (webforms) की तुलना में एक अलग प्रतिमान है। सर्वर और क्लाइंट के बीच फॉर्म तत्वों को एक्सेस करना Asp.Net MVC में एक अलग दृष्टिकोण लेता है।

आप वेब पर इस पर अधिक पढ़ने सामग्री को Google पर जा सकते हैं। अभी के लिए, मैं सर्वर पर डेटा प्राप्त करने या पोस्ट करने के लिए अजाक्स का उपयोग करने का सुझाव दूंगा। आप अभी भी input type="hidden" को नियोजित कर सकते हैं, लेकिन इसे ViewData या रेजर, ViewBag से मान के साथ प्रारंभ करें।

उदाहरण के लिए, अपने नियंत्रक कुछ ऐसा दिखाई देगा:

public ActionResult Index() 
{ 
    ViewBag.MyInitialValue = true; 
    return View(); 
} 

आपके विचार में, आप एक इनपुट elemet कि में मूल्य से आरंभ नहीं हो जाता हो सकता है आपके ViewBag:

<input type="hidden" name="myHiddenInput" id="myHiddenInput" value="@ViewBag.MyInitialValue" /> 

तो फिर तुम AJAX के माध्यम से क्लाइंट और सर्वर के बीच डेटा पास कर सकते हैं। उदाहरण के लिए, jQuery का उपयोग कर:

$.get('GetMyNewValue?oldValue=' + $('#myHiddenInput').val(), function (e) { 
    // blah 
}); 

आप वैकल्पिक रूप से $.ajax, $.getJSON, $.post आपकी आवश्यकता के आधार पर उपयोग कर सकते हैं।

+2

मैं समझता हूं कि आपका सुझाव चीजों को करने का मानक एमवीसी तरीका नहीं है। लेकिन मैं शुरुआत में एक त्वरित और गंदे दृष्टिकोण की तलाश में हूं और मैं आपका उदाहरण अधिक सिखाऊंगा। बाद में जब समय की अनुमति मिलती है तो मैं अपने समाधान को बेहतर मानक में दोबारा लिखूंगा लेकिन अभी के लिए मुझे इसे दरवाजा बाहर निकालना होगा। मुझे अभी तक यकीन नहीं है, लेकिन यह वह जवाब हो सकता है जिसे मैं ढूंढ रहा था। –

+0

इसे आज़माएं और देखें। मैं कुछ अन्य सामानों के लिए ऐसा कर रहा हूं, लेकिन आपके उद्देश्यों के लिए यह भी व्यवहार्य हो सकता है। यह सबसे अच्छा अभ्यास नहीं है, लेकिन एमवीसी फिर भी अजाक्स को नियोजित करने से मना नहीं करता है। बस इस तकनीक का व्यापक रूप से उपयोग न करें। –

8

यदि आप रेजर का उपयोग कर रहे हैं, तो आप सीधे फ़ील्ड तक नहीं पहुंच सकते हैं, लेकिन आप इसका मूल्य प्रबंधित कर सकते हैं।

विचार यह है कि पहला माइक्रोसॉफ्ट दृष्टिकोण डेवलपर्स को वेब विकास से दूर चलाता है और वेब अनुप्रयोग बनाने के लिए डेस्कटॉप प्रोग्रामर (उदाहरण के लिए) के लिए इसे आसान बनाता है।

इस बीच, वेब डेवलपर्स, एएसपी.नेट के इस मुश्किल अजीब तरीके को समझ में नहीं आया।

वास्तव में यह छुपा इनपुट क्लाइंट-साइड पर प्रदान किया जाता है, और एएसपी के पास इसका कोई उपयोग नहीं होता है (यह कभी नहीं था)। हालांकि, समय में आप इसे एक पायरेटिकल तरीके से देखेंगे और जब आप इसका उपयोग करेंगे, तो आप उस पर भरोसा कर सकते हैं। वेब विकास डेस्कटॉप या मोबाइल से अलग है।

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

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

मॉडल

public class MyClassModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string MyPropertyForHidden { get; set; } 
} 

इस नियंत्रक aciton

public ActionResult MyPageView() 
{ 
    MyClassModel model = new MyClassModel(); // Single entity, strongly-typed 
    // IList model = new List<MyClassModel>(); // or List, strongly-typed 
    // ViewBag.MyHiddenInputValue = "Something to pass"; // ...or using ViewBag 

    return View(model); 
} 
है

दृश्य के नीचे

//This will make a Model property of the View to be of MyClassModel 
@model MyNamespace.Models.MyClassModel // strongly-typed view 
// @model IList<MyNamespace.Models.MyClassModel> // list, strongly-typed view 

// ... Some Other Code ... 

@using(Html.BeginForm()) // Creates <form> 
{ 
    // Renders hidden field for your model property (strongly-typed) 
    // The field rendered to server your model property (Address, Phone, etc.) 
    Html.HiddenFor(model => Model.MyPropertyForHidden); 

    // For list you may use foreach on Model 
    // foreach(var item in Model) or foreach(MyClassModel item in Model) 
} 

// ... Some Other Code ... 

ViewBag साथ दृश्य है:

// ... Some Other Code ... 

@using(Html.BeginForm()) // Creates <form> 
{ 
    Html.Hidden(
     "HiddenName", 
     ViewBag.MyHiddenInputValue, 
     new { @class = "hiddencss", maxlength = 255 /*, etc... */ } 
    ); 
} 

// ... Some Other Code ... 

हम छिपे हुए क्षेत्र को प्रस्तुत करने के लिए एचटीएमएल हेल्पर का उपयोग कर रहे हैं या हम इसे हाथ से लिख सकते हैं - <input name=".." id=".." value="ViewBag.MyHiddenInputValue"> भी।

व्यूबैग दृश्य के कुछ प्रकार के डेटा वाहक हैं। यह आपको मॉडल के साथ प्रतिबंधित नहीं करता है - आप जो चाहें उसे रख सकते हैं।

+0

Thats क्यों मैं रेजर उदाहरणों का उल्लेख करता हूं। – Rolice

+0

@ फ्रैंकिस एमवीसी और वेबफॉर्म के बीच अंतर नहीं जानता है। रेजर या एएसपीएक्स व्यू इंजन कोई फर्क नहीं पड़ता क्योंकि वह एमवीसी में एएसपीएक्स व्यू इंजन का उपयोग कर सकता है और अभी भी वही समस्या का सामना कर सकता है। –

+0

मैं इस विचार से बहुत कुछ आया हूं। हालांकि, मुझे यह व्यावहारिक रूप से बेकार करना मुश्किल लगता है कि मुझे अपने दृश्य पृष्ठ पर हर नियंत्रण के लिए एक नया मॉडल और/या नियंत्रक कार्रवाई परिणाम बनाना चाहिए।यहां तक ​​कि यदि किसी पृष्ठ पर नियंत्रण के लिए पृष्ठ या कार्रवाई परिणामों के लिए एकाधिक नियंत्रक होने के बावजूद (जहां तक ​​मुझे पता है कि यह नहीं है लेकिन मैं गलत होने के लिए खुला हूं), मैं उस क्रिया परिणाम को कॉल करने के बारे में कैसे कहूं प्रासंगिक नियंत्रक। मैं इस दृष्टिकोण पर उलझन में हूं, हालांकि आपके उत्तर के लिए धन्यवाद। –

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