方案
我有一个主/详细信息页面,顶部有主数据,详细数据有表格格式的循环。
我想在用户点击按钮时获得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
答案 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)