2011-03-10 28 views
0

我正在嘗試允許用戶查看啤酒。鑑於基本模型:POST模型屬性到控制器而不使用隱藏的輸入?

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Beer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class BeerReview 
{ 
    public int Id { get; set; } 
    public virtual Beer { get; set; } 
    public virtual User { get; set; } 
    public string Review { get; set; } 
} 

我有我使用以及視圖模型:

public class BeerReviewViewModel 
{ 
    public BeerReview Review { get; set; } 
    ... 
} 

我有以下的控制器操作:

public ActionResult Review(int id) 
{ 
    var beer = // get beer by Id 
    BeerReviewViewModel model = new BeerReviewViewModel 
    { 
      BeerReview = new BeerReview 
      { 
       Beer = beer.First() 
      } 
    }; 
    return View("Review", model); 
} 

[HttpPost] 
public ActionResult Review(BeerReviewViewModel submission) 
{ 
    if(ModelState.IsValid) 
    { 
      // here is the problem 
      int id = submission.Review.Beer.Id; 
    } 
} 

在我看來,我爲用戶提供了一個簡單的表單來查看啤酒。的看法是這樣的:

@model MyNamespace.BeerReviewViewModel 
<h2>Review Beer: @Model.Review.Beer.Name</h2> 

@{ 
    using(Html.BeginForm()){ 
      <div> 
       @Html.TextAreaFor(b => b.Model.Review.Review) 
      </div> 
      <div> 
       <input type="submit" value="Post Review" /> 
      </div> 
    } 
} 

很顯然,我沒有張貼有關啤酒本身的控制器任何東西,所以在BeerReviewViewModel啤酒對象總是空。我想知道是否自從表單提交之前在視圖中已經有了我的Beer對象,如果有辦法告訴表單在POST上發送這些數據。我試過在控制器上使用Bind [Prefix =「b」],但沒有運氣。我想我總是可以在BeerReviewViewModel中添加一個int,並從視圖向控制器發送一個隱藏的啤酒Id值(或者爲每個啤酒屬性發送一個隱藏值)。但是,這仍然對我來說似乎是黑客。任何意見,將不勝感激。

回答

0

您的視圖模型需要放平。如果您考慮數據包含的內容,那麼您正在查看一系列被封裝到查詢字符串中的鍵值對。您將無法嵌套對象(除非您的默認ctor能夠構建這些嵌套對象)。

或者你可以寫你自己的模型綁定器,但我發現這是解決了錯誤的問題。

+0

那麼,對於一個POST它將在有效載荷,但同樣的差異 – 2011-03-10 15:01:41