有没有办法在MVC2中更新ViewModel?

时间:2010-03-02 01:19:38

标签: asp.net asp.net-mvc-2 viewmodel mvvm

此代码有效:

[HttpPost]
public ActionResult Edit(int id, FormCollection fc)
{
    Movie movie =
        (
            from m in _ctx.Movie.Include("MovieActors")
                where m.MovieID == id select m
        ).First();
    MovieActorViewModel movieActor = new MovieActorViewModel(movie);

    if (TryUpdateModel(movieActor))
    {
        _ctx.ApplyPropertyChanges(movieActor.Movie.EntityKey.EntitySetName,
            movieActor.Movie);
        _ctx.SaveChanges();
    }

    return View(movieActor);
}

但是,我不确定如何测试它,并且通常更倾向于让方法采用类型化的模型:

[HttpPost]
public ActionResult Edit(MovieActorViewModel movieActor)

这可能吗?我需要对MovieActorViewModel类进行哪些更改才能启用此功能?该课程如下:

public class MovieActorViewModel
{
    public Movie Movie { get; set; }
    public Actor Actor { get; set; }

    public PublisherDealViewModel(Movie movie)
    {
        this.Movie = movie;
        this.Actor =
            (
                from a in this.Movie.Actors
                    where a.ActorID == 1 select a
            ).First();
    }
}

视图是键入的(继承ViewPage)简单:

<% using (Html.BeginForm()) {%>
    Movie Title: <%= Html.TextBoxFor(model=>model.Movie.Title) %><br/>
    Actor Name: <%= Html.TextBoxFor(model=>model.Actor.Name) %>
<% } %>

3 个答案:

答案 0 :(得分:2)

绝对可能。 MVC2中的默认绑定器将尝试根据表单中字段的名称绑定发布到操作的表单中的值。如果您使用Html.TextBoxFor()之类的帮助程序并且模型的名称匹配正确,则应自动填充模型中的值。

但是,如果表单中的名称与ViewModel上的属性不完全匹配,则可能需要进行一些调整。您可以使用BindAttribute自定义绑定的方式,在某种程度上:

public ActionResult SomeAction([Bind(Prefix="MyEntity" Include="Property1,Property2)] MyEntityModel someEntity)

BindAttribute允许您指定要绑定的属性,并且可以使用Exclude参数从绑定中明确排除某些属性。如果要将表单中的属性绑定到ViewModel中复杂对象的属性(即MyViewModel.MyDataObject),则可以使用前缀。在这种情况下使用强类型帮助程序时,您的表单名称将为“MyDataObject.FirstName”。前缀允许您为表单字段名称指定前缀。

您还可以定义完全自定义的Binders。 LosTechies的Jimmy Board对此有一个blog post

答案 1 :(得分:0)

创建视图时,请选中“创建强类型视图”,然后选择MovieActorViewModel作为视图数据类。在这种情况下,您可能需要“编辑”作为您的查看内容类型。

答案 2 :(得分:0)

好的,这很奇怪,可能与我机器上安装的特定MVC版本有关...(来自RC1安装的v2.0.0.0),但我实际上通过重命名属性来解决这个问题

public Movie Movie { get; set; }
public Actor Actor { get; set; }

public Movie TheMovie { get; set; }
public Actor TheActor { get; set; }
如果道具名称与班级名称相同,

似乎默认的粘合剂会混淆吗?