方案
路线:/ template / customize / 10
其中:10 =模板的ID()
在控制器中,模型是基于模板创建的,因此View模型实际上是一个Customization()对象,实际上Id为0,因为它是新的。
在视图中我渲染@ Html.HiddenFor(m => m.Id),隐藏输入的结果值 10 ,但它应该 0 因为m是Customization类型。我之前在使用MVC 2时遇到过这个问题并且不使用辅助方法解决了这个问题。
问题
是否有注释或其他东西 可以添加到Html Helper方法 实际上渲染正确的值?
这是一个错误(MVC似乎是 渲染m.Id作为路线值 无论实际型号是什么 在控制器中设置?)
其他澄清代码
查看
@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>
}
控制器
public ActionResult Customize( int id )
{
var template = Persistence.Data.RetrieveObject<Template>( id );
var model = new Customization();
ViewBag.Template = template;
return ( View( model ) );
}
解决方案
将Action的签名更改为:
public ActionResult Customize( int TemplateId ){ ... }
将链接更改为操作:
@Html.ActionLink( "customize", "customize", new { TemplateId = template.Id } )
我最终得到了一个看起来像
的网址/template/customize?TemplateId=10
这很丑陋,但是我可以用模特来保持自己的视野。这对我来说是一场胜利。
答案 0 :(得分:6)
在这种情况下,您始终可以选择不使用HTML帮助程序,而是使用纯HTML:
<input name="Id" id="Id" type="hidden" value="@Model.Id"/>
答案 1 :(得分:2)
我认为这是因为当你使用像@Html.HiddenFor( m => m.Id )
这样的东西时,html助手会在不同的地方查看输入的值,而路线中的值就是其中一个。
因此,您可以更改路线,使其类似于template/customize/{TemplateId}
,然后让您的操作方法反映出来,例如public ActionResult Customize(int templateId)
。
或者您可以更改具有CustomizationId
属性而非Id
属性的viewmodel(或创建自定义视图模型)。
不,这不是一个错误...它更像是一个可以带来无法预料的后果的功能。但是一旦你意识到它,它就像一种享受。
答案 2 :(得分:0)
要防止路由值覆盖模型的相应属性,请在控制器操作中调用printf "$DATA"
。 使用/读取模型状态后,请小心调用此方法。
ModelState.Clear()
就我而言,隐藏的输入获取模型的值而不是路由值。