【问题标题】:POST model properties to controller without using hidden inputs?在不使用隐藏输入的情况下将模型属性发布到控制器?
【发布时间】: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


    【解决方案1】:

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

    或者您可以编写自己的模型绑定器,但我发现这样解决了错误的问题。

    【讨论】:

    • 好吧,对于 POST,它会在有效负载中,但相同的区别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多