I’m using MVC3 .NET4.0 (VB), and I’m seeing some strange behavior on a simple View. It’s a Create view that is set up as:
Inherits="System.Web.Mvc.ViewPage(Of MyProject.MyTable)
The controller is pretty straightforward. It accepts the ID of the parent record to which this record is being added:
Function Create(parent As Integer) As ActionResult
Return View(New MyTable With {.parent_id = parent})
End Function
The View also accepts a date among other things, but it boils down to this:
<% Using Html.BeginForm()%>
<%=Html.ValidationSummary(True)%>
<%=Html.DisplayFor(Function(model) model.parent_id)%>
<%=Html.TextBoxFor(Function(model) model.start_date)%>
<%=Html.ValidationMessageFor(Function(model) model.start_date, "*")%>
<button type="submit" id="submitButton">Save</button>
<% End Using%>
I’m testing the handling of date errors, so right now my post controller is just checking for errors and not doing much else:
<HttpPost()>
Function Create(model As MyTable) As ActionResult
If ModelState.IsValid Then
Return RedirectToAction("Index")
Else
Return View(model)
End If
End Function
When I first load the view, I see the parent ID displayed on the form. If I put a bad date into the start date field and hit Submit, the form comes back with the invalid value highlighted, but the parent ID = 0. If I break the code in the post, I can see that “model” doesn’t have the parent ID set. This obviously causes all kinds of problems, because I’ve essentially lost who the parent is. What am I doing wrong?
UPDATE
Per Darin’s suggestion I changed DisplayFor to HiddenFor and didn’t see any difference. So then I tried TextBoxFor and got stranger results. I still don’t see the parent ID in the post function, but the value persists in the text box.
You are not including the
parent_idas hidden field in your form. Inside your form you have a single input element which corresponds to thestart_datefield, so that’s all that you can hope to get in your POST action.So:
The
DisplayForthat you used only displays the value, it doesn’t emit any input field to transport this value to the server when the form is submitted.