Asp.net-Mvc
您可以從 MVC 3 中的強類型模型中刪除 HTML 欄位前綴嗎?
我有一個這樣的視圖模型:
public class EditVM { public Media.Domain.Entities.Movie Movie { get; set; } public IEnumerable<Genre> Genres { get; set; } }電影是我想要編輯的真實實體。流派只是用來填充下拉列表。當我打電話時,我寧願這樣:
@Html.TextBoxFor(m => m.Movie.Title)在我的強類型視圖中,輸入控制項有一個名稱 =
"Title"而不是"Movie.Title"我不希望通過使用
ViewData等將我的視圖拆分為部分視圖或失去我的強類型視圖。有沒有辦法向視圖表達我不希望有
Movie.前綴?我注意到你可以設置:ViewData.TemplateInfo.HtmlFieldPrefix = "x";在控制器中,但不幸的是,它似乎只允許添加一個額外的前綴。設置它
""什麼都不做。有什麼解決方法嗎?或者,如果我希望保留強類型視圖和 lambda,我是否堅持使用在這種情況下實際上並不需要的不幸前綴?
謝謝你的幫助。
更新:
這是控制器操作,可能會使事情更清楚一些。
public ActionResult Edit(int? id) { var vm = new EditVM { Movie = id.HasValue ? _movieSvc.Find(id.Value) : new Movie(), Genres = AppData.ListGenres() }; return View(vm); } [HttpPost] public void Edit([Bind(Prefix = "Movie")]Movie m) { _movieSvc.AddOrUpdateMovie(m); //Exceptions handled elsewhere }
不,為了做你想做的事,你必須重寫 Html 助手,然後你必須編寫自己的模型綁定器。似乎為了最小的收益而做很多工作。
唯一的選擇是您將 Movie 對像作為模型傳遞的 Partial 視圖。但是,這將需要您編寫自己的模型綁定器以使其被辨識。
您必須執行 m.Movie.Title 的原因是 ID 具有正確的名稱,因此模型綁定程序可以將其辨識為模型的成員。
根據您的更新:
您的選擇是:
- 使用非強類型助手。
- 使用局部視圖。
- 重寫 stronly 類型的助手
- 根本不使用助手,並將值寫入 HTML
就個人而言,我只會使用 1 或 2,可能是 2。
編輯:
根據您上面的更新。將您的程式碼更改為此(注意,Genres 不會被回發到伺服器,因此 m.Genres 在回發時只會為空):
[HttpPost] public void Edit(EditVM m) { _movieSvc.AddOrUpdateMovie(m.Movie); //Exceptions handled elsewhere }編輯:
我確實只是想到了一個替代方案。你可以簡單地這樣做:
@{ var Movie = Model.Movie; } @Html.TextBoxFor(m => Movie.Title)但是,如果出現驗證錯誤,則必須重新創建 EditVM。