-1

シナリオ

上部にマスター データを含むマスター/詳細ページと、表形式のループを含む詳細データがあります。
ユーザーがボタンをクリックしたときにIDを取得したい。

問題

HttpPostアクションが呼び出されましたが、モデルが空です。すべてのフィールドが必須というわけではありませんが、hiddenField である 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 で値を取得しています)
md.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)' の null 非許容型 'System.Int64' のパラメーター 'saleID' の null エントリが含まれています。オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。パラメータ名: パラメータ

解決

最後に、 HTML.DisplayForの代わりに HTML.HiddenForを使用して解決しました

4

2 に答える 2

1

Html.DisplayForは、ビューにモデル プロパティを表示するためのものです。ビューに入力をレンダリングしません。したがって、ビューで収集されてコントローラーに送信されるデータがないため、明らかにモデルは null です。

Html.EditorFor代わりに使用する必要があります。

隠し入力をコントローラーに投稿するだけでよい場合、投稿されたデータを ViewModel にバインドしようとしているのはなぜですか? アクションを次のように変更するだけです。

public ActionResult SalesDetail(long saleID)
{
}
于 2013-10-06T18:24:14.173 に答える