2010-03-02 53 views
1

此代碼的工作:有沒有辦法更新MVC2中的ViewModel?

[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) %> 
<% } %> 
+0

發佈您的頁面標記代碼 - 您是否使用Html.TextBoxFor()等強類型的Html助手? – 2010-03-02 01:42:27

+0

是的,我是。只有2個屬性在頁面上進行測試: <%= Html.TextBoxFor(model => model.Movie.Title)%> 和 <%= Html.TextBoxFor(model => model.Actor.FirstName)% > – Juvaly 2010-03-02 02:08:35

+0

我以最惱人的方式工作。將MovieActorViewModel屬性名稱從Actor更改爲ActorInfo。我不知道爲什麼這個技巧... – Juvaly 2010-03-03 14:53:54

回答

0

當你創建一個視圖,勾選「創建強類型視圖」,然後選擇MovieActorViewModel作爲View數據類。在這種情況下,您可能需要將「編輯」視爲您的視圖內容類型。

+0

該視圖是強類型的。這段代碼在控制器中。 – Juvaly 2010-03-02 01:25:53

2

這絕對有可能。 MVC2中的默認綁定器將嘗試根據表單中字段的名稱來綁定發佈到操作的表單中的值。如果您使用像Html.TextBoxFor()這樣的助手並且您的模型的名稱正確匹配,則模型中的值應自動填充。

但是,如果表單中的名稱與ViewModel上的屬性完全不匹配,則可能需要進行一些調整。您可以使用BindAttribute定製結合發生的方式,在一定程度上:

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

BindAttribute允許您指定要綁定的屬性,並且可以使用排除參數從綁定明確排除一些。如果要將表單中的屬性綁定到ViewModel中複雜對象的屬性(即MyViewModel.MyDataObject),則可以使用前綴。在這種情況下,當您使用強類型幫助器時,您的表單名稱將爲「MyDataObject.FirstName」。前綴允許您爲表單字段名稱指定前綴。

您也可以定義完全自定義的綁定器。吉米董事會對此有一個blog post

+0

好吧,所以如果它應該自動發生,我做錯了什麼,因爲對象與兩個屬性(電影,演員)是空的,即使我使用類型的HTML幫助器。 – Juvaly 2010-03-02 03:07:12

+0

運行應用程序時查看源代碼並仔細查看錶單名稱。他們可能被稱爲「Movie.Title」,而不僅僅是「標題」。使用BindAttribute的Prefix =「Movie」來修復該問題。 – 2010-03-02 04:16:11

+0

這沒有奏效。 – Juvaly 2010-03-02 04:47:52

0

好吧,這是奇怪的,並且可能涉及到安裝在我的機器上的具體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; } 

似乎是默認的粘結劑會很困惑,當道具名稱相同的類名?

相關問題