HTTPPOST, शब्दकोश या शब्दकोश से फॉर्म वैल्यू कैसे प्राप्त करें?


112

मेरे पास एक MVC नियंत्रक है जिसमें यह क्रिया विधि है:

[HttpPost]
public ActionResult SubmitAction()
{
     // Get Post Params Here
 ... return something ...
}

फॉर्म एक साधारण टेक्स्टबॉक्स के साथ एक गैर-तुच्छ रूप है।

सवाल

मैं पैरामीटर मानों का उपयोग कैसे करूं?

मैं एक दृश्य से पोस्ट नहीं कर रहा हूं, पोस्ट बाहरी रूप से आ रहा है। मैं मान रहा हूं कि मेरे पास पहुंच वाले कुंजी / मूल्य जोड़े का एक संग्रह है।

मैंने कोशिश की Request.Params.Get("simpleTextBox");लेकिन यह त्रुटि देता है "क्षमा करें, आपके अनुरोध को संसाधित करते समय एक त्रुटि हुई।"

जवाबों:


155

आपके पास आपकी नियंत्रक कार्रवाई एक वस्तु हो सकती है जो प्रपत्र इनपुट नामों को दर्शाती है और डिफ़ॉल्ट मॉडल बाइंडर स्वचालित रूप से आपके लिए यह ऑब्जेक्ट बनाएगा:

[HttpPost]
public ActionResult SubmitAction(SomeModel model)
{
    var value1 = model.SimpleProp1;
    var value2 = model.SimpleProp2;
    var value3 = model.ComplexProp1.SimpleProp1;
    ...

    ... return something ...
}

एक और (स्पष्ट रूप से बदसूरत) तरीका है:

[HttpPost]
public ActionResult SubmitAction()
{
    var value1 = Request["SimpleProp1"];
    var value2 = Request["SimpleProp2"];
    var value3 = Request["ComplexProp1.SimpleProp1"];
    ...

    ... return something ...
}

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

1
कभी-कभी आपको बदसूरत सामान की ज़रूरत होती है, एक चुनाव करना अच्छा होता है जब आप पहले से ही जानते हैं कि सबसे अच्छे अभ्यास क्या हैं
ऑस्कर ऑर्टिज़

जैसे कोई अभी भी डॉट नेट सीख रहा है, दूसरा तरीका बदसूरत क्यों है?
हंस

3
@Go, क्योंकि यह जादुई तार है। आपको कोई संकलित समय सुरक्षा नहीं मिलती है। यदि आप चर के नाम पर टाइपो बनाते हैं तो आपका कोड रनटाइम में विफल हो जाएगा जबकि यदि आप मजबूत टाइपिंग का उपयोग कर रहे हैं, तो संकलक आपका मित्र होगा।
डारिन दिमित्रोव

@DarinDimitrov समझ में आता है। मैं जिस दुनिया से आता हूं उससे अलग। बहुत अच्छी सुविधा है।
हंस

104

बस, आप इसका उपयोग कर सकते हैं FormCollection:

[HttpPost] 
public ActionResult SubmitAction(FormCollection collection)
{
     // Get Post Params Here
 string var1 = collection["var1"];
}

आप एक वर्ग का उपयोग भी कर सकते हैं, जिसे फॉर्म मानों के साथ मैप किया गया है, और asp.net mvc इंजन स्वचालित रूप से इसे भरता है:

//Defined in another file
class MyForm
{
  public string var1 { get; set; }
}

[HttpPost]
public ActionResult SubmitAction(MyForm form)
{      
  string var1 = form1.Var1;
}

मुझे कक्षा का हल आसान और सरल लगा
बशीर अल-मम्मी

36

उत्तर बहुत अच्छे हैं लेकिन एमवीसी और .NET की नवीनतम रिलीज़ में एक और तरीका है जो मैं वास्तव में "पुराने स्कूल" फॉर्मकॉलिनेशन और अनुरोध कुंजी के बजाय उपयोग करना चाहता हूं।


एक फार्म टैग के भीतर निहित HTML स्निपेट पर विचार करें जो या तो AJAX या FORM POST करता है।

<input type="hidden"   name="TrackingID" 
<input type="text"     name="FirstName"  id="firstnametext" />
<input type="checkbox" name="IsLegal"  value="Do you accept terms and conditions?" />

आपका नियंत्रक वास्तव में प्रपत्र डेटा को पार्स करेगा और इसे परिभाषित प्रकार के मापदंडों के रूप में आपको वितरित करने का प्रयास करेगा। मैंने चेकबॉक्स शामिल किया क्योंकि यह एक मुश्किल है। यदि जाँच नहीं की जाती है और जाँच नहीं की जाती है तो यह "चालू" पर पाठ लौटाता है। हालांकि आवश्यकता यह है कि ये परिभाषित चर मौजूद होना चाहिए (जब तक कि अशक्त (याद रखें कि हालांकि stringयह अशक्त है)) अन्यथा AJAX या POST वापस विफल हो जाएगा।

[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
    MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}

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

public Class HomeModel
{
  public int HouseNumber { get; set; }
  public string StreetAddress { get; set; }
}

HTML मार्कअप बस होगा ...

<input type="text" name="variableName.HouseNumber" id="whateverid" >

और आपका कंट्रोलर (रेज़र इंजन) फॉर्म वेरिएबल "वैरिएबल नेम" (नाम आपके जैसा है लेकिन इसे लगातार बनाए रखेगा) को इंटरसेप्ट करेगा और इसे बनाने और MyModel में डालने का प्रयास करेगा।

[HttpPost]
public ActionResult PostBack(HomeModel variableName){
    postBack.HouseNumber; //The value user entered
    postBack.StreetAddress; //the default value of NULL.
}

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

TIP: कंट्रोलर में पैरामीटर का नाम HTML मार्क-अप में परिभाषित नाम है "name =" मॉडल का नाम नहीं है, लेकिन इसमें अपेक्षित वैरिएबल का नाम है!


उपयोग करना List<>इसके मार्क-अप में थोड़ा अधिक जटिल है।

<input type="text" name="variableNameHere[0].HouseNumber" id="id"           value="0">
<input type="text" name="variableNameHere[1].HouseNumber" id="whateverid-x" value="1">
<input type="text" name="variableNameHere[2].HouseNumber"                   value="2">
<input type="text" name="variableNameHere[3].HouseNumber" id="whateverid22" value="3">

सूची पर सूचकांक <> हमेशा शून्य आधारित और अनुक्रमिक होना चाहिए। 0,1,2,3।

[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
     int counter = MyHomes.Count()
     foreach(var home in MyHomes)
     { ... }
}

IEnumerable<>गैर शून्य आधारित और गैर अनुक्रमिक सूचकांकों के लिए उपयोग करना वापस पोस्ट करें। बाइंडर की मदद के लिए हमें एक अतिरिक्त छिपा इनपुट जोड़ने की आवश्यकता है।

<input type="hidden" name="variableNameHere.Index" value="278">
<input type="text" name="variableNameHere[278].HouseNumber" id="id"      value="3">

<input type="hidden" name="variableNameHere.Index" value="99976">
<input type="text" name="variableNameHere[99976].HouseNumber" id="id3"   value="4">

<input type="hidden" name="variableNameHere.Index" value="777">
<input type="text" name="variableNameHere[777].HouseNumber" id="id23"    value="5">

और कोड को केवल IEnumerable और कॉल का उपयोग करने की आवश्यकता है ToList()

[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
     int counter = variableNameHere.ToList().Count()
     foreach(var home in variableNameHere)
     { ... }
}

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

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


सूचकांक विकल्प का उपयोग करना अस्पष्ट है। भगवान की हरी पृथ्वी पर कौन जानता है कि यह या कि यह भी अस्तित्व में है का उपयोग करने के लिए होगा ?! लेकिन, मुझे खुशी है कि मुझे यह पद मिला। यह नेटवर्क ट्रैफिक का एक बड़ा सौदा बचाने जा रहा है।
माइकल सिल्वर

1
यह मेरे लिए काम करता है, लेकिन उसके बाद ही मैंने <इनपुट प्रकार = "छिपी" आईडी = "myId"> से @ Html.Hidden ("myId")
रेडकॉन

@Piotr - कृपया MyModel और MyHomes के साथ अपनी संदर्भ विसंगतियों को ठीक करें। यह वर्तमान में भ्रम की स्थिति का कारण बनता है।
स्पेंसर सुलिवन

15

यदि आप बिना किसी मॉडल बाइंडिंग के सीधे Http अनुरोध से फॉर्म डेटा प्राप्त करना चाहते हैं, या FormCollectionआप इसका उपयोग कर सकते हैं:

[HttpPost] 
public ActionResult SubmitAction() {

    // This will return an string array of all keys in the form.
    // NOTE: you specify the keys in form by the name attributes e.g:
    // <input name="this is the key" value="some value" type="test" />
    var keys = Request.Form.AllKeys;

    // This will return the value for the keys.
    var value1 = Request.Form.Get(keys[0]);
    var value2 = Request.Form.Get(keys[1]);
}

2
सावधानी यह है कि यह खराब रूप हो सकता है (कोई दंड नहीं) यह यहाँ एकमात्र समाधान है जो मेरी विशेष स्थिति के अनुकूल है।
रयान

उन स्थैतिक संदर्भों के साथ इकाई का परीक्षण कैसे करें? जब परीक्षण की बात आती है, तो फॉर्मकॉलियन अधिक वांछनीय होगा।
कीस डे विट

@KeesdeWit यदि आप पिछली टिप्पणी को पढ़ते हैं तो यह सबसे अच्छा तरीका नहीं है, लेकिन कभी-कभी इसे वर्कअराउंड के रूप में उपयोग करें। यूनिट टेस्ट के लिए, शायद आप इसे मॉक कर सकते हैं Requestऔर इसे विधि में इंजेक्ट कर सकते हैं ।
A-Sharabiani
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.