2015-12-20 48 views
1

我正在學習ASP.NET MVC,並且遇到以下問題。ASP.NET MVC POST中的空值

視圖 「SelectProdotti」 是

@model Models.SelectProdottiModel 

@{ 
    ViewBag.Title = "Select Prodotti"; 
} 

<h2>@ViewBag.Title</h2> 

@using (Html.BeginForm("ProdottiToListino", "Listino", FormMethod.Post)) 
{ 


    @Html.HiddenFor(m => m.id) 
    @Html.DisplayFor(m=> m.id) 


    <input type="submit" value="Salva" /> 
} 

該加載視圖

public ActionResult SelectProdotti(int id) 
     { 


      SelectProdottiModel model = new SelectProdottiModel(); 
      model.id = id;   

      return View(model); 
     } 

該模型的動作

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace Models 
{ 
    public class SelectProdottiModel 
    { 


     public int id; 

     public SelectProdottiModel() 
     {     
     } 
    } 
} 

控制器中的交動作

[HttpPost] 
     public ActionResult ProdottiToListino(SelectProdottiModel model) 
     { 

      return RedirectToAction("SelectProdotti", "Listino", new {id = model.id }); 
     } 

我寫了這段代碼只是爲了學習,沒用。問題是model.id始終爲0,即視圖不會發布值,錯誤在哪裏?

+3

'public int id'是一個*字段*。默認的模型綁定器甚至不會嘗試綁定它。嘗試使用*屬性*來代替:'public int id {get;組; }' – haim770

回答

2

當前Id是您的類中沒有GETTER/SETTER屬性/方法的字段。

Fields通常用於在類內部存儲數據(並且這些數據將具有默認隱私可見性)。通常這些字段的值將通過另一個公共屬性或方法來設置/讀取。隨着C# properties,這是很容易,如果你想允許一個字段是可讀可寫的,你可以當你從形式發佈的數據,該DefaultModelBinder(A類來創建一個公共屬性像

public int Age {set;get;} 

這將表單數據映射到類對象)將嘗試創建SelectProddottiModel類的對象,並嘗試設置與發佈表單數據中表單項名稱匹配的公共屬性的值。如果您沒有使用set訪問器將您的字段設置爲公共屬性,則模型聯編程序無法設置該值。

將您的字段Id更改爲setget的屬性,以便ModelBinder可以從發佈的表單數據中設置值。

public class SelectProdottiModel 
{ 
    public int id {set;get;}  
} 

此外,C#通常使用PascalCasing。所以我建議你把你的id屬性改爲Id

+0

不正確 - C#屬性通常是[Pascal大小寫,而不是駱駝大小寫](https://msdn.microsoft.com/en-us/library/x2dbyw72(v = vs.71).aspx)。 C#字段通常是駱駝案例。 – NightOwl888

+0

@ NightOwl888哎呀!我用錯了。感謝您的注意。 – Shyju