POST模型属性到控制器而不使用隐藏输入?

时间:2011-03-10 14:53:25

标签: .net asp.net-mvc-3 entity-framework-ctp5

我试图让用户查看啤酒。鉴于基本模型:

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的隐藏值从视图发送到控制器(或者为每个啤酒属性发送一个隐藏值)。但同样,这对我来说似乎仍然是黑客。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的视图模型需要展平。如果您考虑该帖子数据包含的内容,您将查看一系列封装在查询字符串中的键值对。您将无法拥有嵌套对象(除非您的默认ctor能够构建这些嵌套对象)。

或者你可以编写自己的模型绑定器,但我发现它正在解决错误的问题。