使用Route Id值的ASP.NET MVC 3 Model Id

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遇到过这种情况,并且通过不使用辅助方法解决了这个问题.

问题

  1. 是否有注释或我可以添加到Html Helper方法以实际呈现正确的值?

  2. 这是一个错误(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)

这很丑陋,但是我可以用模型来保持我的视野.这对我来说是一场胜利.

dom*_*enu 6

在这种情况下,您始终可以选择不使用HTML帮助程序,而是使用纯HTML:

<input name="Id" id="Id" type="hidden" value="@Model.Id"/>


Cha*_*ino 3

我认为这是因为当您使用@Html.HiddenFor( m => m.Id )html 助手之类的东西时,会在不同的位置查找来填充输入的值,而路由中的值就是这些位置之一。

因此,您可以更改您的路线,使其类似于template/customize/{TemplateId}然后让您的操作方法反映这一点,例如public ActionResult Customize(int templateId)

或者您可以更改具有属性而CustomizationId不仅仅是Id.

不,这不是一个错误……它更像是一个可能会产生不可预见后果的功能。但一旦你意识到这一点,它就像一种享受。