Scenario
Route: /template/customize/10
Where: 10 = ID of Template()
In the controller the model is created based on the template so that the View's model is actually a Customization() object which actually has an Id of 0 because it's new.
In the view I render @Html.HiddenFor( m => m.Id ) and the resulting value of that hidden input is 10, though it should be 0 because m is of type Customization. I've run into this before with MVC 2 and worked around it by not using helper methods.
Questions
Is there annotation or something I can add to the Html Helper method to actually render the correct value?
Is this a bug (MVC seems to be rendering m.Id as the route value regardless of what the actual model is set to in the controller)?
Additional code for clarification
View
@model Project.Core.Domain.Customization
@using( Html.BeginForm( "save", "customization" ) )
{
@Html.HiddenFor( m => m.Id )
@Html.HiddenFor( m => m.Template.Id )
<button type="submit" id="save" name="save">Save</button>
}
Controller
public ActionResult Customize( int id )
{
var template = Persistence.Data.RetrieveObject<Template>( id );
var model = new Customization();
ViewBag.Template = template;
return ( View( model ) );
}
Solution
Changed signature of Action to:
public ActionResult Customize( int TemplateId ){ ... }
Changed link to action as such:
@Html.ActionLink( "customize", "customize", new { TemplateId = template.Id } )
I end up with a url that looks like
/template/customize?TemplateId=10
It's uglier, but I get to keep my view clean with model.Id so this is a win for me.