Dot-Net

使用路由 ID 值的 ASP.NET MVC 3 模型 ID

  • April 22, 2016

場景

路徑:/template/customize/10 其中:10 = Template() 的 ID

在控制器中,模型是基於模板創建的,因此 View 的模型實際上是一個 Customization() 對象,實際上它的 ID 為 0,因為它是新的。

在視圖中,我渲染 @Html.HiddenFor( m => m.Id ) 並且隱藏輸入的結果值為10,儘管它應該為0因為 m 是自定義類型。我之前使用 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>
}

控制器

      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

它更醜陋,但我可以用 model.Id 保持我的觀點乾淨,所以這對我來說是一個勝利。

我認為這是因為當您使用 html 幫助程序之類的東西時,@Html.HiddenFor( m => m.Id )會在各個地方查找來填充輸入的值,而路由中的值就是其中之一。

因此,您可以更改路線,使其類似於template/customize/{TemplateId}然後讓您的操作方法反映這一點,例如public ActionResult Customize(int templateId).

或者你可以改變你的視圖模型(或創建一個自定義視圖模型),它有一個CustomizationId屬性,而不僅僅是Id.

不,這不是一個錯誤……它更多的是一個可能產生無法預料的後果的功能。但是一旦你意識到它,它就像一種享受。

在這種情況下,您始終可以選擇不使用 HTML Helper,而是使用純 HTML:

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

引用自:https://stackoverflow.com/questions/5315926