【发布时间】:2011-03-10 14:53:25
【问题描述】:
我正在尝试让用户评论啤酒。给定基本模型:
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 对象始终为空。我想知道是否因为在表单提交之前我已经在视图上拥有了我的 Beer 对象,是否有办法告诉表单在 POST 上发送这些数据。我试过在控制器上使用 Bind[Prefix="b"] 没有运气。我想我总是可以向 BeerReviewViewModel 添加一个 int 并将啤酒 ID 的隐藏值从视图发送到控制器(或为每个啤酒属性发送一个隐藏值)。但同样,这对我来说仍然是 hack-ish。任何建议将不胜感激。
【问题讨论】:
标签: .net asp.net-mvc-3 entity-framework-ctp5