2012-01-24 12 views
7

मैं एमवीसी के लिए बिल्कुल नया हूं और वास्तव में मॉडल बाइंडिंग में उपयोग करने की कोशिश कर रहा हूं। मेरे पास एक साधारण मॉडल है जिसे मैंने एक रूप में बनाया है। हालांकि, जब मैं केवल उस फॉर्म को पोस्ट करता हूं तो टेक्स्टबॉक्स मान नियंत्रक को ले जा रहे हैं। मुझे विवरण फ़ील्ड की भी आवश्यकता है जो DisplayTextFor का उपयोग करके किया जाता है। क्या यह कुछ है जिसके लिए मुझे कस्टम मॉडल बाइंडर बनाना है? मैं एक शॉर्टकट ले सकता हूं और विवरण को केवल सीमा के बिना केवल पढ़ने के लिए टेक्स्टबॉक्स बना सकता हूं, इसलिए यह टेक्स्ट की तरह दिखता है, लेकिन मैं इसे सही तरीके से करना चाहता हूं।एमवीसी 3 पूरे मॉडल को पोस्ट नहीं कर रहा है

public class FullOrder 
{ 
    public List<FullOrderItem> OrderList { get; set; } 
    public string account { get; set; } 
    public string orderno { get; set; } 
} 

public class FullOrderItem 
{ 
    public int? ID { get; set; } 
    public int? OrderId { get; set; } 
    public string Description { get; set; } 
    public int Qty { get; set; } 
    public decimal? Price { get; set; } 
} 

यहाँ है देखें

<table class="ExceptionAltRow"> 
    <tr style="background-color: #DDD;"> 
     <td class="strong" style="width:500px;"> 
      Description 
     </td> 
     <td class="strong" style="width:100px;"> 
      Qty 
     </td> 
     <td class="strong" style="width:100px;"> 
      Previous Purchases 
     </td> 
    </tr> 
    @for (int i = 0; i < Model.FullOrder.OrderList.Count(); i++) 
    { 
     <tr> 
      <td> 
       @Html.DisplayTextFor(m => m.FullOrder.OrderList[i].Description) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 
      </td> 
     </tr> 
    } 
    </table> 

यहाँ है नियंत्रक::

[HttpPost] 
public ActionResult AddItem(FullOrder f) 
{ 
    //doesn't work description is not passed but qty is 
} 

वहाँ एक रास्ता है कि मैं अपने मॉडल मिल बस पर पारित करने के लिए कर सकते हैं है यहाँ मेरी कोड है एक पोस्ट पर विवरण भले ही यह मेरे मॉडल से बाध्य आइटम के लिए एक टेक्स्टबॉक्स नहीं है?

उत्तर

2

आपके आवेदन पर पोस्ट किया जाने वाला एकमात्र डेटा वह डेटा है जो सबमिट किए जा रहे फॉर्म पर उपलब्ध है (जब तक फॉर्म फ़ील्ड अक्षम नहीं होते हैं)। आप custom model binder को कार्यान्वित करके नियंत्रक को क्या देख सकते हैं ओवरराइड कर सकते हैं।

इस मामले में, अपने प्रपत्र एक भी पाठ क्षेत्र के कई उदाहरणों के होते हैं: आप विवरण और बाहर भरा अन्य बातों चाहते हैं, तो

@Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 

, वे फार्म पर उपस्थित होने की जरूरत है।

@Html.HiddenFor(m => m.FullOrder.OrderList[i].Description) 

भी देखें What does Html.HiddenFor do?

+0

धन्यवाद में शामिल होंगे, वास्तव में क्या मुझे पता है की जरूरत है। – mscard02

+0

यदि कोई उत्तर उपयोगी है, तो आपको इस तरह इंगित करने के लिए ऊपर तीर पर क्लिक करना चाहिए। –

0

DisplayTextFor समारोह केवल ब्राउजर के डोम के लिए पाठ उत्पादन करने जा रहा है: वे दिखाई दे सकता है की जरूरत नहीं है, तो आप HiddenFor सहायक का उपयोग कर सकते हैं। एमवीसी फ्रेमवर्क का बाध्यकारी मूल रूप से POST/GET चर को देखता है, और स्वचालित रूप से उन मानों को आपके मॉडल पर सेट करता है।

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

मेरे सिफारिश और जो मैं हमेशा किया है कि जानकारी को वापस पोस्ट की गई कुछ है करने के लिए नहीं, और सिर्फ यह स्पष्ट रूप से सेट नियंत्रक कार्रवाई के भीतर की उम्मीद है:

[HttpPost] 
    public ActionResult AddItem(FullOrder f) 
    { 
     // Next line is just showing that you should get the existing order 
     // from your data layer 
     FullOrder existingOrder = orderRepository.GetExistingOrder(); 

     // Now loop through f.OrderList and update the quantities 
     foreach(OrderItem item in f.OrderList) { 
      // Find the existing item and update the quantity. 
     } 

     // Now you have the original information from the DB along with 
     // updated quantities. 

     // Save results or do whatever is next 
     existingOrder.Save(); 
    } 
1
बेशक

आप यह काम नहीं कर सकते इस तरह

सबसे पहले, आपको पता होना चाहिए कि मॉडल बाइंडिंग मूल रूप से क्लाइंट पक्ष पर इनपुट से डेटा भेजने का उपयोग करती है। Html.DisplayTextFor सहायक इनपुट उत्पन्न नहीं करता है, यह सरल पाठ उत्पन्न करता है। टेक्स्ट सबमिट किए जाने पर क्लाइंट से भेजे गए डेटा में टेक्स्ट भाग नहीं लेते हैं, इसलिए आप उन्हें मॉडल-बाध्य नहीं करते हैं। यदि आप Request.Form संपत्ति पर एक नज़र डालें, तो आपको सबूत देखना चाहिए - कोई विवरण फ़ील्ड नहीं है।

यदि आप पाठ प्रदर्शित करना चाहते हैं और फ़ॉर्म मानों में विवरण भाग लेने के लिए भी कर सकते हैं, तो छिपे हुए क्षेत्र का उपयोग करना है।MVC इस तरह इस

@for (int i = 0; i < Model.FullOrder.OrderList.Count(); i++) 
    { 
     <tr> 
      <td> 
       @Html.DisplayTextFor(m => m.FullOrder.OrderList[i].Description) 
       @Html.HiddenFor(m => m.FullOrder.OrderList[i].Description) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 
      </td> 
     </tr> 
    } 

के लिए सहायक है, प्रस्तुत फ़ॉर्म का वर्णन मूल्यों मदद के लिए भी

+0

यह जानना अच्छा है कि HiddenFor <इनपुट प्रकार = "छुपा"> टैग के रूप में प्रस्तुत करता है। – dotnetN00b

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