[英]List item inside model always null on post - Asp.net MVC
我正在嘗試發布包含List <>項目的模型,如下所示:
public class AddSubscriptionPlanModel
{
public AddSubscriptionPlanModel()
{
AllFeatures = new List<Feature>();
}
public int Id { get; set; }
public int SubscriptionPlanId { get; set; }
public int SubscriptionId { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
[Display(Name = "No Of Users")]
public int? NoOfUsers { get; set; }
[Display(Name = "Duration Type")]
public DurationType DurationType { get; set; }
public int Duration { get; set; }
public decimal Amount { get; set; }
public int SubscriptionPlanTrailId { get; set; }
public int FeatureId { get; set; }
public DateTime CreatedDateUtc { get; set; }
public DateTime LastUpdatedUtc { get; set; }
public int CreatedBy { get; set; }
public int LastUpdatedBy { get; set; }
public List<Feature> AllFeatures { get; set; }
}
我在get方法中填充所有必填字段,並從數據庫中填充List
public ActionResult Mapping(int id)
{
var features = FeatureManager.GetAllFeatures();
var model = new Ejyle.DevAccelerate.Web.App.Models.SubscriptionPlan.AddSubscriptionPlanModel();
model.AllFeatures = features;
model.Id = id;
model.SubscriptionId = id;
model.NoOfUsers = 20;
model.SubscriptionPlanId = 1;
model.SubscriptionPlanTrailId = 1;
model.Amount = 1000;
model.CreatedBy = 1;
model.LastUpdatedBy = 1;
model.FeatureId = 1;
model.Duration = 20;
return View(model);
}
我的視圖代碼如下所示:
@using (Html.BeginForm("Mapping", "SubscriptionPlans", FormMethod.Post))
{
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Amount)
@Html.HiddenFor(model => model.Duration)
@Html.HiddenFor(model => model.FeatureId)
@Html.HiddenFor(model => model.CreatedBy)
@Html.HiddenFor(model => model.LastUpdatedBy)
@Html.HiddenFor(model => model.NoOfUsers)
@Html.HiddenFor(model => model.SubscriptionId)
@Html.HiddenFor(model => model.SubscriptionPlanId)
@Html.HiddenFor(model => model.SubscriptionPlanTrailId)
@Html.HiddenFor(model => model.AllFeatures)
<table class="table table-striped">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.IsActive)
</th>
</tr>
</thead>
<tbody>
@for (int i=0; i < Model.AllFeatures.Count; i++)
{
<tr>
@Html.HiddenFor(model => model.AllFeatures[i].Id)
@Html.HiddenFor(model => model.AllFeatures[i].Name)
@Html.HiddenFor(model => model.AllFeatures[i].IsActive)
<td>
@Html.TextBoxFor(model => model.AllFeatures[i].Id)
</td>
<td>
@Html.TextBoxFor(model => model.AllFeatures[i].Name)
</td>
<td>
@Html.EditorFor(model => model.AllFeatures[i].IsActive)
</td>
</tr>
}
</tbody>
</table>
<input type="submit" class="btn btn-success" value="Submit" name="Submit"/>
}
在View上,列表項正確呈現,甚至我也可以編輯這些字段。
但是在發布時,所有屬性都具有除AllFeatures列表項屬性以外的值,該屬性始終顯示count = 0。
編輯1:這是渲染功能時我的視圖的樣子
編輯2:
該方法的簽名發布到:
[HttpPost]
public ActionResult Mapping(AddSubscriptionPlanModel model)
{
}
但是在發布時,所有屬性都具有除AllFeatures列表項屬性以外的值,該屬性始終顯示count = 0。
AllFeatures
是Feature
的通用列表。 執行此操作時:
@Html.HiddenFor(model => model.AllFeatures)
Razor視圖引擎將呈現以下內容:
<input id="AllFeatures"
name="AllFeatures"
type="hidden"
value="System.Collections.Generic.List`1[Namespace.Feature]">
<!--Where Namespace is the Namespace where Feature is defined. -->
換句話說, HiddenFor
調用項目上的ToString()
並將其簡單地放入input
標簽的value
屬性中。
開機自檢后會發生什么
發布表單時, DefaultModelBinder
正在尋找一個名為AllFeatures
的屬性,但其類型為string
因此可以將其分配給它:
System.Collections.Generic.List`1[Namespace.Feature]
它沒有找到一個,因為你的模型沒有AllFeatures
類型的string
,所以它簡單地忽略它,並結合所有其他屬性。
AllFeatures列表項屬性,始終顯示count = 0。
是的,它不是您發布的AllFeatures
列表,而是構造函數中的一個列表,它顯然是一個空列表,計數為0:
public AddSubscriptionPlanModel()
{
AllFeatures = new List<Feature>();
}
我不確定為什么要將所有功能發送到客戶端(瀏覽器),然后將其重新發布到服務器。
解
要解決此問題,只需刪除以下行:
@Html.HiddenFor(model => model.AllFeatures)
現在,在綁定過程中不會引起任何混亂,MVC會將循環中的項目綁定到AllFeatures
屬性。
實際上,據我所知,您真正需要的唯一代碼是(如果出於其他原因需要隱藏字段,我可能是錯誤的。但是,如果您只希望用戶編輯AllFeature,不需要任何隱藏字段):
@for (int i = 0; i < Model.AllFeatures.Count; i++)
{
<tr>
<td>
@Html.TextBoxFor(model => model.AllFeatures[i].Id)
</td>
<td>
@Html.TextBoxFor(model => model.AllFeatures[i].Name)
</td>
<td>
@Html.EditorFor(model => model.AllFeatures[i].IsActive)
</td>
</tr>
}
我認為您的問題可能是嵌套屬性。 您可能需要查看已發布的表單,並查看其外觀。
假設模型綁定適用於嵌套屬性,那么您的標記看起來正確,但我不確定這樣做是否正確。 (只是確保我搜索並發現了這條舊的Haack帖子,它表明您做對了: Haack Post )
作為一種解決方法(和POC),您可以嘗試以下操作:在功能操作中添加新參數,像現在那樣發布但不嵌套(因此您不能使用Model For HTML helper),然后在控制器,您可以將其設置回主對象的features屬性。
這樣做的方法,例如從視圖綁定到列表的上下文中,是不正確的。
視圖:
@model Testy20161006.Controllers.AddSubscriptionPlanModel
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Mapping</title>
</head>
<body>
@*I am using controller home*@
@using (Html.BeginForm("Mapping", "Home", FormMethod.Post))
{
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Amount)
@Html.HiddenFor(model => model.Duration)
@Html.HiddenFor(model => model.FeatureId)
@Html.HiddenFor(model => model.CreatedBy)
@Html.HiddenFor(model => model.LastUpdatedBy)
@Html.HiddenFor(model => model.NoOfUsers)
@Html.HiddenFor(model => model.SubscriptionId)
@Html.HiddenFor(model => model.SubscriptionPlanId)
@Html.HiddenFor(model => model.SubscriptionPlanTrailId)
@Html.HiddenFor(model => model.AllFeatures)
<table class="table table-striped">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.IsActive)
</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.AllFeatures.Count; i++)
{
<tr>
@*BE SURE to get rid of these*@
@*@Html.HiddenFor(model => model.AllFeatures[i].Id)
@Html.HiddenFor(model => model.AllFeatures[i].Name)
@Html.HiddenFor(model => model.AllFeatures[i].IsActive)*@
<td>
@Html.TextBoxFor(model => model.AllFeatures[i].Id)
</td>
<td>
@Html.TextBoxFor(model => model.AllFeatures[i].Name)
</td>
<td>
@Html.EditorFor(model => model.AllFeatures[i].IsActive)
</td>
</tr>
}
</tbody>
</table>
<input type="submit" class="btn btn-success" value="Submit" name="Submit" />
}
</body>
</html>
控制器:
[HttpPost]
public ActionResult Mapping(AddSubscriptionPlanModel addSubscriptionModel, FormCollection formCollection)
{
var AllFeatures = String.Empty;
var index = "AllFeatures[";
foreach (var item in formCollection)
{
if (item.ToString().Contains(index))
{
AllFeatures += " " + formCollection.GetValues(item.ToString())[0];
}
}
//put breakpoint here to see userValues
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.