HttpPost Action获取空模型按钮单击

时间:2013-10-06 18:19:09

标签: asp.net-mvc asp.net-mvc-4

方案

我有一个主/详细信息页面,顶部有主数据,详细数据有表格格式的循环。
我想在用户点击按钮时获得Id。

问题

被调用的

HttpPost动作但是空模型。我想要的SaleId是hiddenField,并不是所有的字段都是必需的

我的模型

// Sales is Master Model
public class sales
{
    [Required]
    [Display(Name = "sale_id")]
    public long saleID { get; set; }
    [Required]
    [Display(Name = "orderDate")]
    public DateTime orderDate { get; set; }
    [Required]
    [Display(Name = "Name")]
    public string Name { get; set; }
}
// This is Detail Model
public class salesDetail
{
    [Required]
    [Display(Name = "sale_id")]
    public long saleID { get; set; }

    [Required]
    [Display(Name = "pkg_dur")]
    public int pkgdur { get; set; }

    [Required]
    [Display(Name = "m_name")]
    public string mName { get; set; }

    [Display(Name = "price")]
    public decimal price { get; set; }
}
// This is used to display data in view 
public class SalesMD
{
    public sales sale = new sales();
    public List<salesDetail> detail = new List<salesDetail>();
}

查看

   @model namespace.Models.SalesMD

  //For Showing Master Data
       @Html.HiddenFor(m => m.sale.saleID)
       @Html.DisplayFor(m => m.sale.Name)
       @Html.DisplayFor(m => m.sale.orderDate)

  // For Showing Detail Data in table form
  @foreach (var item in Model.detail)
   {
      @Html.DisplayFor(modelItem => item.mName)
      @Html.DisplayFor(modelItem => item.pkgdur) Month(s)
      @Html.DisplayFor(modelItem => item.price)
   }

控制器

    public ActionResult SalesDetail(Models.SalesMD md)

此处md获取的值为0且null
记住:我只想要SaleId的SaleId 我试图像md.sale.saleID那样得到saleId,但它是零

最后呈现隐藏字段的HTML。它有值

   <input data-val="true" data-val-number="The field sale_id must be a number." 
     data-val-required="The sale_id field is required." id="sale_saleID" 
      name="sale.saleID" type="hidden" value="2">

当我使用时

   [HttpPost]
   public ActionResult SalesDetail(long saleID) 

它正在生成异常

  

参数字典包含'MAK_ERP.Controllers.makAdminController'中方法'System.Web.Mvc.ActionResult SalesDetail(Int64)'的非可空类型'System.Int64'的参数'saleID'的空条目。可选参数必须是引用类型,可空类型,或者声明为可选参数。   参数名称:参数

解决方案

  

最后通过使用 HTML.HiddenFor 而不是来解决   的 HTML.DisplayFor

2 个答案:

答案 0 :(得分:1)

Html.DisplayFor用于在视图中显示您的模型属性。它不会在您的视图中呈现输入。因此,显然,Model是null,因为在View中没有收集数据并提交给Controller。

您需要改为使用Html.EditorFor

如果您只需要将隐藏输入发布到Controller,为什么要尝试将发布的数据绑定到ViewModel?只需将您的操作更改为:

public ActionResult SalesDetail(long saleID)
{
}

答案 1 :(得分:0)

您要么错过了表单@html.BeginForm(...),要么您没有在此处添加代码,如果您只是在saleID之后,则需要使用..

[HttpPost]
public ActionResult SalesDetail(long saleID)