I have a simple ASP.NET MVC 3 dummy app (just learning MVC coming from WebForms).
And I’m pretty confused about how to update a form without actually having some DB stuff in between. I just have a form with a textbox and after I press the button I want to see the string in uppercase. But my nothing happens.
The controller:
public ActionResult Index()
{
ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" };
return View(model);
}
[HttpPost]
public ActionResult Index(ToUppercaseModel model)
{
model.TheString = model.TheString.ToUpper();
return View(model);
}
The model:
public class ToUppercaseModel
{
[Display(Name = "My String")]
public string TheString { get; set; }
}
And the view:
@using (Html.BeginForm()) {
<div>
<div class="editor-label">
@Html.LabelFor(m => m.TheString)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.TheString)
</div>
<p>
<input type="submit" value="Convert" />
</p>
</div>
}
This is a simple as it gets I think. Now obviously the return View(model); in the 2nd Index method is not working. I saw some stuff about RedirectToAction() and storing the data in TempData. Most example just submit some id, but since I don’t have db that does not work.
If I do this:
return RedirectToAction("Index", model);
I get a
No parameterless constructor defined for this object.
Error Message. This should be simple, no? I think I understand the Post/Redirect/Get concept, but don’t see how to apply it for something simple as this.
Thanks for some clarification.
When MVC renders a view it will use the attempted value of a field rather than the model’s value if it exists (eg in a datefield I put “Tuesday”, this won’t model bind but you’ll want to show the user the field with their input and highlighted as invalid), you’re changing the model’s value but not the attempted value.
The attempted value is held in the modelstate dictionary:
ModelState["KeyToMyValue"].Value.Value.AttemptedValueAccessing and changing these values can be tricky unless you want a load of magic strings in your code, and as validation happens on modelbinding your changed value won’t be validated.
My recommendation in these circumstances is to call
ModelState.Clear(), this will remove all validation and attempted values, then change your model directly. Finally you want to get your validation on the model by usingTryValidateModel(yourModel).Be aware that this method is probably the easiest non-hacky method of doing this but will remove attempted values that could not bind from the returned view.