我试图让用户查看啤酒。鉴于基本模型:
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对象始终为null。我想知道是否因为我已经在表单提交之前在视图上有我的Beer对象,如果有办法告诉表单在POST上发送这些数据。我试过在控制器上使用Bind [Prefix =“b”]而没有运气。我想我总是可以在BeerReviewViewModel中添加一个int,并将view Id的隐藏值从视图发送到控制器(或者为每个啤酒属性发送一个隐藏值)。但同样,这对我来说似乎仍然是黑客。任何建议将不胜感激。
答案 0 :(得分:0)
您的视图模型需要展平。如果您考虑该帖子数据包含的内容,您将查看一系列封装在查询字符串中的键值对。您将无法拥有嵌套对象(除非您的默认ctor能够构建这些嵌套对象)。
或者你可以编写自己的模型绑定器,但我发现它正在解决错误的问题。