使用路由 ID 值的 ASP.NET MVC 3 模型 ID
場景
路徑:/template/customize/10 其中:10 = Template() 的 ID
在控制器中,模型是基於模板創建的,因此 View 的模型實際上是一個 Customization() 對象,實際上它的 ID 為 0,因為它是新的。
在視圖中,我渲染 @Html.HiddenFor( m => m.Id ) 並且隱藏輸入的結果值為10,儘管它應該為0因為 m 是自定義類型。我之前使用 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它更醜陋,但我可以用 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"/>