Absenden in MVC 4-Modell ist null in der controller-Methode post
Also mein problem jetzt ist, dass ich nicht mehr mein Modell in meinem controller wenn ich behaupte das folgende Formular aus. Ich versuche, die Elemente aus der BillingCodes (das ist eine Liste von BillingCodeObjects) Durchlaufen und anzeigen. Ich entfernt einige code von diesen, die nicht wirklich relevant für die situation, um es kürzer und einfacher zu Lesen.
Hier ist der code für meine Ansicht...
@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>
Und hier ist ein code für mein controller:
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
}
}
}
}
und zu guter Letzt, hier die info, dass im Modell:
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()
{
}
}
hier ist ein Bild von der debug einheimischen, wenn das Formular zurückgegeben..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du machst eine foreach auf die Ansichten, so dass die input-Elemente sollten die Werte irgendwo gepostet wie dieser :
name="BillingCodes[0].EnterTimeHours"
,name="BillingCodes[0].EnterTimeMinutes"
können Sie überprüfen auf der Registerkarte Netzwerk die Anfrage auf den Chrome-Entwicklertools (STRG+SHIFT+C)oder einfach nur Anzeige der Quelle. Wenn dies der Fall ist, sind Sie der Einreichung mehrerer BillingCodeObj Objekte. Sie müssen einen controller erhalten.
Werfen Sie einen Blick auf den source-code, da dies sehr helfen, Sie verstehen, was passiert hinter den kulissen.
Versuchen, diese auf Ihrem controller:
Können Sie auch (für debugging-Zwecke) tun
und kontrollieren die form, wie aufgefüllt wird, auf debug.
nach Kommentaren und mehr code zur Verfügung gestellt
ändern Sie Ihre Ansicht zu :
erstellen Sie eine neue cshtml in EditorTemplates/BillingCodeObj.cshtml :
public void SubmitTimesheet(BillingCodeObj item){
<-- das funktioniert ?(IEnumerable<BillingCodesObj> billingCodes)
Ihrer Sicht ist der Typ von
BillingCodeList
, aber Sie versuchen, zu sendenList<BillingCodeObj>
Sie action im controller.Versuchen zu ändern, handeln Sie wie folgt vor:
edit: Es scheint nicht, dass Sie initialisieren Ihre BillingCodeList die Liste element, um eine
new List<BillingCode>()
bevor Sie Sie senden Sie das Modell aus, um die Ansicht. Oder sind Sie?