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

时间:2011-03-15 17:57:01

标签: .net asp.net asp.net-mvc asp.net-mvc-3 html-helper

方案
路线:/ 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作为路线值 无论实际型号是什么 在控制器中设置?)

  3. 其他澄清代码

    查看

    @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
    

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

3 个答案:

答案 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()

就我而言,隐藏的输入获取模型的值而不是路由值。