Есть ли способ обновить ViewModel в MVC2? - PullRequest
1 голос
/ 02 марта 2010

Этот код работает:

[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 ]

2 голосов
/ 02 марта 2010

Это абсолютно возможно. Привязка по умолчанию в MVC2 будет пытаться связать значения в форме, которые публикуются в действии, на основе имен полей в форме. Если вы используете такие помощники, как Html.TextBoxFor(), и имена вашей Модели совпадают должным образом, значения в модели должны быть заполнены автоматически.

Если, однако, имена в вашей форме не полностью совпадают со свойствами вашей ViewModel, возможно, вам придется внести некоторые изменения. Вы можете использовать атрибут BindAttribute, чтобы в некоторой степени настроить способ привязки:

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

BindAttribute позволяет вам указать, какие свойства вы хотите связать, и вы можете использовать параметр Exclude, чтобы явно исключить некоторые из связывания. Если вы хотите привязать свойства из формы к свойствам сложного объекта в ViewModel (т.е. MyViewModel.MyDataObject), тогда можно использовать префикс. Ваши имена форм будут "MyDataObject.FirstName", когда вы будете использовать строго типизированных помощников в этом случае. Префикс позволяет указать префикс для имен полей формы.

Вы также можете определить полностью настраиваемые подшивки. Джимми Борд из LosTechies имеет сообщение в блоге об этом.

0 голосов
/ 06 апреля 2010

Хорошо, это странно и может быть связано с конкретной версией MVC, установленной на моем компьютере ... (v2.0.0.0 из установки RC1), но я фактически решил эту проблему, переименовав свойства из

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

до

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

похоже, что переплет по умолчанию запутывается, когда имя реквизита совпадает с именем класса?

0 голосов
/ 02 марта 2010

При создании представления отметьте «Создать строго типизированное представление» и выберите MovieActorViewModel в качестве класса данных представления. И в этом случае вам может потребоваться «Изменить» в качестве типа просмотра.

...