ASP.Net MVC नियंत्रक से डेटा को पास कैसे करें [बंद]


81

मैं ASP.Net के लिए पूरी तरह से नया हूं और मुझे यकीन है कि यह एक बहुत ही बुनियादी सवाल है, जिसमें मेरे पास एक दृश्य है जिसमें रिपोर्ट उत्पन्न करने के लिए एक लिंक है लेकिन रिपोर्ट उत्पन्न करने में सक्षम होने के लिए मुझे उपयोगकर्ता को एक उपयुक्त पाठ नाम प्रदान करने के लिए कहना चाहिए कुंआ।

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

मुझे इस मामले में नियंत्रक से दृश्य को पास करने की आवश्यकता है।

उदाहरण के साथ किसी भी सलाह की सराहना की जाएगी।

अपडेट करें

मैं समझता हूं कि मुझे डेटा को सर्वर पर वापस पोस्ट करना होगा लेकिन razorhtml कोड और नियंत्रक के रूप में यह कैसे पता चलता है?


उपयोगकर्ता को कुछ पोस्ट करना होगा - दृश्य सीधे नहीं जानता कि किसी नियंत्रक से कैसे संवाद किया जाए।
डैनियल ए। व्हाइट

यदि आप Microsoft दस्तावेज़ीकरण पढ़ते हैं, तो आप देखेंगे कि यह नहीं समझाता है कि यह कैसे करना है।
पॉल मैकार्थी

जवाबों:


133

आप इसे ViewModels के साथ कर सकते हैं जैसे आपने अपने नियंत्रक से डेटा कैसे देखा।

मान लें कि आपके पास इस तरह का एक दृश्य है

public class ReportViewModel
{
   public string Name { set;get;}
}

और अपने GET एक्शन में,

public ActionResult Report()
{
  return View(new ReportViewModel());
}

और आपके विचार को दृढ़ता से टाइप किया जाना चाहिए ReportViewModel

@model ReportViewModel
@using(Html.BeginForm())
{
  Report NAme : @Html.TextBoxFor(s=>s.Name)
  <input type="submit" value="Generate report" />
}

और अपने नियंत्रक में HttpPost कार्रवाई विधि में

[HttpPost]
public ActionResult Report(ReportViewModel model)
{
  //check for model.Name property value now
  //to do : Return something
}

या बस, आप POCO वर्गों (Viewmodels) के बिना यह कर सकते हैं

@using(Html.BeginForm())
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

और अपने HttpPost एक्शन में, टेक्स्टबॉक्स नाम के समान नाम वाले पैरामीटर का उपयोग करें।

[HttpPost]
public ActionResult Report(string reportName)
{
  //check for reportName parameter value now
  //to do : Return something
}

संपादित करें: टिप्पणी के अनुसार

यदि आप किसी अन्य कंट्रोलर को पोस्ट करना चाहते हैं, तो आप BeginForm विधि के इस अधिभार का उपयोग कर सकते हैं ।

@using(Html.BeginForm("Report","SomeOtherControllerName"))
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

देखने की क्रिया विधि से डेटा पास करना?

आप समान दृश्य मॉडल का उपयोग कर सकते हैं, बस अपने GET एक्शन विधि में संपत्ति मान सेट कर सकते हैं

public ActionResult Report()
{
  var vm = new ReportViewModel();
  vm.Name="SuperManReport";
  return View(vm);
}

और आपके विचार में

@model ReportViewModel
<h2>@Model.Name</h2>
<p>Can have input field with value set in action method</p>
@using(Html.BeginForm())
{
  @Html.TextBoxFor(s=>s.Name)
  <input type="submit" />
}

आपके द्वारा प्रस्तुत विकल्प / विधि 2 में (मॉडल के बिना) नियंत्रक नाम निर्दिष्ट करने का एक तरीका है? क्योंकि इस पोस्ट अनुरोध को प्राप्त करने वाला नियंत्रक इस दृश्य के नियंत्रक से अलग है ..
अहमद

@ अहम: अद्यतन उत्तर की जाँच करें। आप BeginForm विधि के विशिष्ट अधिभार का उपयोग कर सकते हैं।
श्यजु

4
उत्कृष्ट, आपके महान उत्तर के लिए धन्यवाद ..
अहमद

अच्छा, मैं अब कुछ घंटों के लिए देख रहा हूँ। धन्यवाद!
दान ब्यूलियू

धन्यवाद!! बहुत स्पष्ट जवाब। मेरे मामले के लिए, HttpPost एक्शन में, मुझे टेक्स्टबॉक्स नाम के समान नाम वाले पैरामीटर का उपयोग करने की आवश्यकता नहीं थी। केवल पैरामीटर के रूप में मॉडल ऑब्जेक्ट डालें, मैं मूल्यों को पुनः प्राप्त करने में सक्षम हो सकता हूं।
हनीन हेट्ट हेट औंग

27

यदि आप पोस्ट नहीं करना चाहते / चाहती हैं तो:

@Html.ActionLink("link caption", "actionName", new { Model.Page })  // view's controller
@Html.ActionLink("link caption", "actionName", "controllerName", new { reportID = 1 }, null);

[HttpGet]
public ActionResult actionName(int reportID)
{

ध्यान दें कि नए {} भाग में रिपोर्टआईडी कार्रवाई मापदंडों में रिपोर्टआईडी से मेल खाती है, आप इस तरह से किसी भी संख्या में पैरामीटर जोड़ सकते हैं, लेकिन 2 या 3 से अधिक (कुछ हमेशा बहस करेंगे) आपको एक POST के माध्यम से एक मॉडल पारित करना चाहिए ( अन्य उत्तर के अनुसार)

संपादित करें : टिप्पणियों में बताए अनुसार सही अधिभार के लिए जोड़ा गया अशक्त। बहुत सारे ओवरलोड हैं और यदि आप एक्शन + कंट्रोलर दोनों को निर्दिष्ट करते हैं, तो आपको रूटवैल्यूज़ और htmlAttributes दोनों की आवश्यकता होती है। नियंत्रक (केवल कैप्शन + एक्शन) के बिना, केवल रूटवैल्यू की आवश्यकता होती है लेकिन हमेशा दोनों को निर्दिष्ट करने के लिए सबसे अच्छा अभ्यास हो सकता है।


4
इस सरल उत्तर में आने वाले किसी भी व्यक्ति को FYI करें, अपने रूट वैल्यू [new {reportID = 1}] को शामिल करने के बाद एक शून्य जोड़ें, अन्यथा यह उन्हें htmlAttributes के रूप में लेने की कोशिश करेगा और वे इसके माध्यम से नहीं आएंगे,
Hardycore

22
<form action="myController/myAction" method="POST">
 <input type="text" name="valueINeed" />
 <input type="submit" value="View Report" />
</form> 

नियंत्रक:

[HttpPost]
public ActionResult myAction(string valueINeed)
{
   //....
}

1
<input type = "valueINeed" प्रकार = "text"> होना चाहिए <input name = "valueINeed" प्रकार = "text">
ग्रेग

Thnx। अद्यतन प्रतिक्रिया।
Azure SME
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.