你能从MVC 3中的强类型模型中删除HTML字段前缀吗?

C.J*_*.J. 9 model-view-controller asp.net-mvc view asp.net-mvc-3

我有一个这样的视图模型:

public class EditVM
{
  public Media.Domain.Entities.Movie Movie       { get; set; }
  public IEnumerable<Genre>          Genres      { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

电影是我想编辑的真实实体.类型只是为了填充下拉列表.我打电话时更喜欢这样:

@Html.TextBoxFor(m => m.Movie.Title)
Run Code Online (Sandbox Code Playgroud)

在我的强类型视图中,输入控件的名称= "Title"而不是"Movie.Title"

我不希望通过使用等将我的观点分成部分视图或丢失我的强类型视图ViewData.

有没有办法向View表达我不希望有Movie.前缀?我注意到你可以设置:

ViewData.TemplateInfo.HtmlFieldPrefix = "x";
Run Code Online (Sandbox Code Playgroud)

在控制器中,但不幸的是它似乎只允许添加一个额外的前缀.设置它""什么都不做.

这有什么工作吗?或者,如果我希望保留强类型视图和lambdas,我是否会遇到在这种情况下并非真正必要的不幸前缀?

谢谢你的帮助.

更新:

这是控制器的动作,可能会让事情变得更清晰.

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
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*sch 5

不,为了做你想做的事,你必须重写Html助手,然后你必须编写自己的模型绑定器.似乎很多工作都是为了获得最低收益.

唯一的选择是部分视图,您可以将Movie对象作为模型传递.但是,这需要您编写自己的模型绑定器以使其被识别.

您必须执行m.Movie.Title的原因是ID具有正确的名称,因此模型绑定器可以将其识别为模型的成员.

根据您的更新:

你的选择是:

  1. 使用非强类型帮助程序.
  2. 使用局部视图.
  3. 重写stronly类型的助手
  4. 根本不要使用帮助程序,并将值写入HTML

就个人而言,我只使用1或2,可能是2.

编辑:

根据您的上述更新.将代码更改为此(请注意,Genres不会回发到服务器,因此m.Genres在回发时将为null):

[HttpPost] 
public void Edit(EditVM m) 
{ 
   _movieSvc.AddOrUpdateMovie(m.Movie); //Exceptions handled elsewhere 
} 
Run Code Online (Sandbox Code Playgroud)

编辑:

我只是想到了另一种选择.你可以这样做:

@{ var Movie = Model.Movie; }
@Html.TextBoxFor(m => Movie.Title)
Run Code Online (Sandbox Code Playgroud)

但是,如果存在验证错误,则必须重新创建EditVM.