2013-08-14 19 views
8

içinde sıfırdır Bu yüzden şu anki sorunum şu formu gönderdiğimde modelimi denetleyicime alamıyorum. BillingCodes öğelerinden (BillingCodeObjects listesinin bir listesi olan) döngü içerisine girmeye ve görüntülemeye çalışıyorum. Bunlardan daha kısa ve daha kolay okunması için durumla ilgili olmayan bazı kodları kaldırdım. İşte MVC 4 modelinde Gönderme Formu denetleyici gönderim yöntemi

...

@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> 

Bence kodudur Ve burada benim denetleyicisi için bazı kod:

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 
     } 
    } 

} 
} 

ve son olarak, burada modelde olduğu info: Form döndürüldüğünde buraya

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() 
     { 

     } 
    } 

..

ayıklama halk resmidir

image of locals

cevap

6

Sen görünümlerde bir foreach yapıyoruz, bu nedenle giriş elemanları değerleri yerde buna benzer yayınlanmıştır olmalıdır: name="BillingCodes[0].EnterTimeHours", name="BillingCodes[0].EnterTimeMinutes" ağ sekmesinde inceleyebilir Chrome Geliştirici Araçları (CTRL + SHIFT + C isteği veya sadece kaynağı görüntüleyerek. Bu durumda, birden çok BillingCodeObj nesnesi gönderiyorsunuz. Bunu alan bir denetleyiciniz olmalı.

Kaynak koduna bir göz atın çünkü bu, sahnelerin arkasında neler olduğunu anlamanıza yardımcı olabilir. Ayrıca (Hata ayıklama amacıyla)

public void SubmitTimesheet(FormCollection form){} 

yapabilirsiniz

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

ve debug doldurulur nasıl formunu incelemek:

Kumandanızda bu deneyin.

yorum ve için görünümünüzü değiştirmek sağlanan daha kod sonra:

@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

Tamam, teşekkürler.İlk şey işe yaramadı, billingCodes nesnesi hala boş. Bu yüzden biraz zaman alacağım ve döndüğü formu inceleyeceğim. –

+0

Oluşturulan girişleri html'ye gönderebilirseniz size memnuniyetle yardımcı olurum. –

+0

tamam Orijinal gönderiyi düzenledim ve yerlilerin bir resmini de buraya ekledim: [link] (http://i.imgur.com/0KXBDXr.png) –

0

Kişisel Görünüm BillingCodeList türüdür, ancak denetleyici içinde size eyleme List<BillingCodeObj> göndermeye çalışıyoruz. aşağıdaki gibi

deneyin eylemini değiştirmek için:

[HttpPost] 
    public void SubmitTimesheet(BillingCodeList model) 
    { 

     string uri = ""; 

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

Hmm:

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

EditorTemplates/BillingCodeObj.cshtml yeni cshtml oluşturun. Sanırım haklısın, ama geri aldığım model nesnesindeki BillingCodes listesi hala boş… herhangi bir fikir var mı? Sorumu kodunuzu içerecek şekilde düzenleyeceğim. –

0

düzenleme: görüşe kapalı modeli göndermeden önce bir new List<BillingCode>() için BillingCodeList listesinde elemanı başlatılıyor olduğunuzu görünmüyor. Yoksa sen misin?

+0

Yapıyorum: BillingCodeList billingCodeList = JsonConvert.DeserializeObject (sonuç); –