-1

设想

我有一个主/明细页面,主数据位于顶部,明细数据以表格格式循环。
我想在用户单击按钮时获取 Id。

问题

HttpPost已调用但模型为空的操作。我想要的是隐藏字段的 SaleId,并非所有字段都是必需的

我的模型

// 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 我正在尝试像那样获取 saleIdmd.sale.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解决了这个问题

4

2 回答 2

1

Html.DisplayFor, 用于在视图中显示模型属性。它不会在您的视图中呈现输入。所以,很明显,模型是空的,因为在你的视图中没有收集数据并提交给控制器。

你需要Html.EditorFor改用。

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

public ActionResult SalesDetail(long saleID)
{
}
于 2013-10-06T18:24:14.173 回答
0

您要么缺少表格,要么@html.BeginForm(...)只是没有在此处包含代码,如果您只是在 之后saleID,则需要使用..

[HttpPost]
public ActionResult SalesDetail(long saleID)
于 2013-10-06T18:35:00.730 回答