脚本
路线:/ template / customize / 10
其中:10 =模板的ID()
路线:/ 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
这很丑陋,但是我可以用模型来保持我的观点清洁.所以这对我来说是一场胜利.
解决方法
我认为这是因为当你使用像@ Html.HiddenFor(m => m.Id)这样的东西时,html助手会在各个地方查看以填充输入的值,并且路径中的值就是其中一个位置.
因此,您可以更改路线,使其类似于模板/自定义/ {TemplateId},然后让您的操作方法反映出来,例如: public ActionResult Customize(int templateId).
或者您可以更改具有CustomizationId属性而不仅仅是Id的viewmodel(或创建自定义视图模型).
不,它不是一个错误…它更像是一个可以带来无法预料的后果的功能.但是一旦你意识到它,它就像一种享受.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。