Sha*_*all 4 .net asp.net asp.net-mvc html-helper asp.net-mvc-3
场景
路线:/ 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>
}
Run Code Online (Sandbox Code Playgroud)
调节器
public ActionResult Customize( int id )
{
var template = Persistence.Data.RetrieveObject<Template>( id );
var model = new Customization();
ViewBag.Template = template;
return ( View( model ) );
}
Run Code Online (Sandbox Code Playgroud)
解
将Action的签名更改为:
public ActionResult Customize( int TemplateId ){ ... }
Run Code Online (Sandbox Code Playgroud)
将链接更改为操作:
@Html.ActionLink( "customize", "customize", new { TemplateId = template.Id } )
Run Code Online (Sandbox Code Playgroud)
我最终得到了一个看起来像的网址
/template/customize?TemplateId=10
Run Code Online (Sandbox Code Playgroud)
这很丑陋,但是我可以用模型来保持我的视野.这对我来说是一场胜利.
在这种情况下,您始终可以选择不使用HTML帮助程序,而是使用纯HTML:
<input name="Id" id="Id" type="hidden" value="@Model.Id"/>
我认为这是因为当您使用@Html.HiddenFor( m => m.Id )html 助手之类的东西时,会在不同的位置查找来填充输入的值,而路由中的值就是这些位置之一。
因此,您可以更改您的路线,使其类似于template/customize/{TemplateId}然后让您的操作方法反映这一点,例如public ActionResult Customize(int templateId)。
或者您可以更改具有属性而CustomizationId不仅仅是Id.
不,这不是一个错误……它更像是一个可能会产生不可预见后果的功能。但一旦你意识到这一点,它就像一种享受。
| 归档时间: |
|
| 查看次数: |
3091 次 |
| 最近记录: |