I am trying to post a part of the page and bind it to view model on the controller. My editor template for SearchVM :
@Html.TextBoxFor(model => model.TestText, new { @class = "form-control ",
@placeholder = "TEXT" , @id="test" })
<input type="submit" value="Submit" />
Index.cshtml:
@using (Html.BeginForm("Search", "Pencil", FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
@Html.EditorFor(model => model.SearchVM);
}
Controller :
public ActionResult Search(SearchVM vm)
{
// ...
}
When I type something on the testText text box and hit submit, I reach the action Search but vm.TestText is empty, I can not bind the form field from editor template to the view model. Any idea?
This is happening because the class passed as the @model to your view wraps the SearchVM class, and when you call @Html.EditorFor(model => model.SearchVM) it renders the input with a prefix SearchVM:
<input id="SearchVM_TestText" name="SearchVM.TestText" value="" ... />
In turn, when posted back to the controller, the ModelBinder will fail to deserialize this into a SearchVM
What you can do is use this EditorFor overload:
@Html.EditorFor(model => model.SearchVM, "_SearchVM", "");
Where _SearchVM is the name of your Editor template. Passing "" as the htmlFieldName parameter will remove the unwanted SearchVM prefix on the input.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With