So…. I have an action in my controller that basically copies the current model and returns a new view based on that copy. To inform the user that this is a copy I append a message via the viewbag stating that it’s a copy. All seemed to be working until I noticed that it’s not the copy that is being used when rendering the new view instead it’s the original, but the viewbag on the other hand is updated so the message is shown.
Hmm, don’t know if that’s understandable so I’ll try to show what i mean with some pseudo-code as well:
Model
public class Model{
[ScaffoldColumn(false)]
[HiddenInput(DisplayValue = false)]
public Guid Id { get; set; }
public string Name { get; set; }
}
View
<input type="submit" name="Copy" value="@_("Copy")"/>
Controller
public ActionResult Copy(model) {
ViewBag.Message = _("This is a copy.");
var clone = model.Clone();
return View("Index", clone);
}
I’m having a real hard time trying to wrap my head around this so any help/tips/pointers are really appreciated.
Oh, I’ve stepped through the code several times to ensure that the clone is really a clone. The only thing that differentiates them is the Id property and that is the new one in the controller but when the view renders it’s back to the old one.
You need to clear the
ModelStatecollection before returning the clone because the HtmlHelpers prefer to reuse the posted data:You can read more about this feature in this artice: ASP.NET MVC Postbacks and HtmlHelper Controls ignoring Model Changes.