2013-08-14 6 views
8

में शून्य है इसलिए मेरी समस्या अभी यह है कि जब मैं यह निम्नलिखित फॉर्म सबमिट करता हूं तो मैं अपने मॉडल को अपने नियंत्रक में नहीं प्राप्त कर सकता। मैं बिलिंग कोड (जो बिलिंगिंग ऑब्जेक्ट्स की एक सूची है) से वस्तुओं को प्रदर्शित करने और प्रदर्शित करने की कोशिश कर रहा हूं। मैंने इनमें से कुछ कोड हटा दिए हैं जो इसे पढ़ने के लिए कम और आसान बनाने के लिए स्थिति के लिए वास्तव में प्रासंगिक नहीं है।एमवीसी 4 मॉडल में प्रपत्र सबमिट करना नियंत्रक पोस्ट विधि

यहाँ मेरे विचार के लिए कोड

@using (Html.BeginForm("SubmitTimesheet", "Timesheet", FormMethod.Post)) 
{ 


foreach (var item in Model.BillingCodes) 
{ 

    <div class="button-padding"> 
     <a class="btn btn-large btn-danger btn-block billCodeBtn"> 
      <div class="btnText">@item.Name</div> 
      <div class="btnTime">@item.TotalHours</div> 

      <i class="icon-chevron-down billCodeIconUp billCodeIcon"></i> 
      <i class="hidden icon-chevron-up billCodeIconDown billCodeIcon"></i> 
     </a> 

     <div class="content" > 
      <div class="row timeEntry"> 
       <p></p> 
       <div class="col-12 col-lg-2"> 
        Enter Time: 
     <div class="row"> 
      <div class="col-12"> 
       @Html.DropDownListFor(model => item.EnterTimeHours, new SelectList(new[] { 
        new { Value = "0", Text = "0" }, 
        new { Value = "1", Text = "1" }, 
        new { Value = "2", Text = "2" }, 
        new { Value = "3", Text = "3" }, 
        new { Value = "4", Text = "4" }, 
        new { Value = "5", Text = "5" }, 
        new { Value = "6", Text = "6" }, 
        new { Value = "7", Text = "7" }, 
        new { Value = "8", Text = "8" }, 
        new { Value = "9", Text = "9" }, 
        new { Value = "10", Text = "10" }, 
        new { Value = "11", Text = "11" }, 
        new { Value = "12", Text = "12" }, 
       }, "Value", "Text")) <b>:</b> 
       @Html.DropDownListFor(model => item.EnterTimeMinutes, new SelectList(new[] { 
        new { Value = "0", Text = "00" }, 
        new { Value = "15", Text = "15" }, 
        new { Value = "30", Text = "30" }, 
        new { Value = "45", Text = "45" }, 
       }, "Value", "Text")) 

      </div> 
     </div> 
       </div> 
       <div class="col-lg-2"></div> 

       <div class="col-lg-1"></div> 
       <div class="control-group col-12 col-lg-2"> 
        <label class="checkbox"> 
         Billable @Html.CheckBoxFor(model => item.Billable) 
        </label> 
       </div> 
       <div class="col-12 col-lg-2"> 
        Enter Memo: 
     <div class="row"> 
      <div class="col-12"> 
       @Html.TextAreaFor(model => item.Comment) 
      </div> 
     </div> 

यहाँ है ... और मेरे नियंत्रक के लिए कुछ कोड है:

public class TimesheetController : Controller 
{ 
    // 
    // GET: /Timesheet/ 

    public ActionResult Index() 
    { 

     string getBillingCodeUrl =""; 

     //SOME CODE REMOVED FOR LENGTH/READABILITY 

     foreach (var entryItem in timePeriod.TimeEntries[0].EntryCollection) 
     { 
      foreach (var billingItem in billingCodeList.BillingCodes) 
      { 
       if (entryItem.BillingCode == billingItem.Name) 
       { 
        //update record in billingItem with data from entryItem 
        billingItem.Comment = entryItem.Comment; 
        billingItem.Billable = entryItem.Billable; 
        billingItem.TotalHours = entryItem.Hours; 
       } 
      } 
     } 

     return View(billingCodeList); 
    } 
    [HttpPost] 
    public void SubmitTimesheet(BillingCodeList model) 
    { 

     string uri = ""; 

     foreach (var billingCode in model.BillingCodes) 
     { 
      //do stuff with each of these 
     } 
    } 

} 
} 

और अंत में, यहाँ की जानकारी मॉडल में है:

public class BillingCodeList 
    { 
     public List<BillingCodeObj> BillingCodes; 
    } 

    public class BillingCodeObj 
    { 
     public string Name { get; set; } 
     public decimal TotalHours { get; set; } 

     public decimal EnterTimeHours { get; set; } 
     public decimal EnterTimeMinutes { get; set; } 
     public bool Billable { get; set; } 
     public string Comment { get; set; } 

     public BillingCodeObj(string name, decimal hours) 
     { 
      this.Name = name; 
      this.TotalHours = hours; 
     } 
     public BillingCodeObj() 
     { 

     } 
    } 

यहाँ डिबग स्थानीय लोगों की एक तस्वीर जब प्रपत्र दिया जाता है है ..

image of locals

उत्तर

6

आप दृश्यों पर एक foreach कर रहे हैं, तो इनपुट तत्वों मूल्यों कहीं इस तरह तैनात होना चाहिए: name="BillingCodes[0].EnterTimeHours", name="BillingCodes[0].EnterTimeMinutes" आप नेटवर्क में टैब का निरीक्षण कर सकते Chrome डेवलपर टूल (Ctrl + Shift + C पर अनुरोध) या सिर्फ स्रोत को देखने। यदि ऐसा है, तो आप एकाधिक बिलिंग कोड ऑब्जेक्ट सबमिट कर रहे हैं। आपके पास एक नियंत्रक होना चाहिए जो प्राप्त करता है।

स्रोत कोड पर नज़र डालें क्योंकि यह आपको दृश्यों के पीछे क्या हो रहा है यह समझने में बहुत मदद कर सकता है।

अपने नियंत्रक पर इस प्रयास करें:

[HttpPost] 
public void SubmitTimesheet(IEnumerable<BillingCodeObj> billingCodes){ 
} 

तुम भी (डीबगिंग उद्देश्यों के लिए) कर सकते हैं

public void SubmitTimesheet(FormCollection form){} 

और फार्म कैसे डिबग पर से भर जाता है का निरीक्षण किया।

के बाद टिप्पणियों और अधिक अपना दृश्य बदलने प्रदान की कोड:

@model BillingCodeObj 
<div class="button-padding"> 
    <a class="btn btn-large btn-danger btn-block billCodeBtn"> 
     <div class="btnText">@Model.Name</div> 
     <div class="btnTime">@Model.TotalHours</div> 

     <i class="icon-chevron-down billCodeIconUp billCodeIcon"></i> 
     <i class="hidden icon-chevron-up billCodeIconDown billCodeIcon"></i> 
    </a> 

    <div class="content" > 
     <div class="row timeEntry"> 
      <p></p> 
      <div class="col-12 col-lg-2"> 
       Enter Time: 
    <div class="row"> 
     <div class="col-12"> 
      @Html.DropDownListFor(model => model.EnterTimeHours, new SelectList(new[] { 
       new { Value = "0", Text = "0" }, 
       new { Value = "1", Text = "1" }, 
       new { Value = "2", Text = "2" }, 
       new { Value = "3", Text = "3" }, 
       new { Value = "4", Text = "4" }, 
       new { Value = "5", Text = "5" }, 
       new { Value = "6", Text = "6" }, 
       new { Value = "7", Text = "7" }, 
       new { Value = "8", Text = "8" }, 
       new { Value = "9", Text = "9" }, 
       new { Value = "10", Text = "10" }, 
       new { Value = "11", Text = "11" }, 
       new { Value = "12", Text = "12" }, 
      }, "Value", "Text")) <b>:</b> 
      @Html.DropDownListFor(model => model.EnterTimeMinutes, new SelectList(new[] { 
       new { Value = "0", Text = "00" }, 
       new { Value = "15", Text = "15" }, 
       new { Value = "30", Text = "30" }, 
       new { Value = "45", Text = "45" }, 
      }, "Value", "Text")) 

     </div> 
    </div> 
      </div> 
      <div class="col-lg-2"></div> 

      <div class="col-lg-1"></div> 
      <div class="control-group col-12 col-lg-2"> 
       <label class="checkbox"> 
        Billable @Html.CheckBoxFor(model => model.Billable) 
       </label> 
      </div> 
      <div class="col-12 col-lg-2"> 
       Enter Memo: 
    <div class="row"> 
     <div class="col-12"> 
      @Html.TextAreaFor(model => model.Comment) 
     </div> 
    </div> 
+0

ठीक है, धन्यवाद।पहली बात काम नहीं कर सका, बिलिंग कोड ऑब्जेक्ट अभी भी शून्य है। तो मैं कुछ समय लेगा और उस फॉर्म का निरीक्षण करूंगा जो यह लौटाता है। –

+0

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

+0

ठीक है मैंने अपनी मूल पोस्ट संपादित की और यहां स्थानीय लोगों की एक तस्वीर भी शामिल की: [link] (http://i.imgur.com/0KXBDXr.png) –

0

आपका देखें BillingCodeList के प्रकार है, लेकिन आप नियंत्रक में आप कार्रवाई करने के लिए List<BillingCodeObj> भेजने की कोशिश कर रहे हैं।

कोशिश कार्रवाई को बदलने के लिए इस प्रकार है:

[HttpPost] 
    public void SubmitTimesheet(BillingCodeList model) 
    { 

     string uri = ""; 

     foreach (var billingCode in model.BillingCodes) 
     { 
      //do stuff with each of these 
     } 
    } 
+0

हम्म:

@using (Html.BeginForm("SubmitTimesheet", "Timesheet", FormMethod.Post)) { @Html.EditorFor(m=>m.BillingCodes) } 

EditorTemplates/BillingCodeObj.cshtml में एक नया cshtml पैदा करते हैं। मुझे लगता है कि आप सही हैं, लेकिन मॉडल ऑब्जेक्ट में बिलिंग कोड की सूची मैं वापस आ गया हूं अभी भी शून्य है .. कोई विचार? मैं अपना कोड शामिल करने के लिए अपने प्रश्न को संपादित करूंगा। –

0

संपादित करें: यह प्रतीत नहीं होता है कि आप एक new List<BillingCode>() करने के लिए अपने BillingCodeList की सूची तत्व आरंभ कर रहे हैं इससे पहले कि आप को देखने के लिए रवाना मॉडल भेजें। या आप हैं?

+0

मैं कर रहा हूं: बिलिंग कोड सूची बिलिंग कोडसूची = JsonConvert.DeserializeObject <बिलिंग कोड सूची> (परिणाम); –

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