MVC4中View不会传回数据给Controller
View will not pass back data to Controller in MVC4
过去 3-4 天我一直在努力寻找答案。我进行了很多搜索,并从已经问过基本相同问题的人那里得到了很多很好的答案。但是,none 的修复对我有用。
这是与工作相关的,因此某些 keywords/names 已更改。我已经逐步完成了程序,控制器正在将列表数据传递给视图,视图正在填充 Display/Textbox 和隐藏字段。但是,返回给控制器的模型具有正确数量的行项目,只是一切都是 0 或 null:
型号
namespace hereismynamespace
{
public class CommissionCodeModel
{
public CommissionCodeModel()
{
CommCodes = new List<CommissionListingItem>();
}
public List<CommissionListingItem> CommCodes { get; set; }
}
}
控制器
namespace hereismynamespace
{
public class CommissionCodeController : Controller
{
[HttpGet]
public ActionResult Manage()
{
var model = new CommissionCodeModel();
var list = CommissionListing.Get(false);
foreach (CommissionListingItem item in list)
{
model.CommCodes.Add(item);
}
return View(model);
}
[HttpPost]
public ActionResult SaveData(List<CommissionListingItem> CommCodes)
{
//do stuff here
return View();
}
}
}
查看
@using (Html.BeginForm("SaveData", "CommissionCode", FormMethod.Post))
{
<table id="commissionCodesPercentage" class="listing">
<thead>
<tr>
<th>Comm ID</th>
<th>Comm Code</th>
<th>Percent</th>
</tr>
</thead>
@for (var i = 0; i < Model.CommCodes.Count; i++)
{
<tr>
<td>@Html.DisplayFor(model => Model.CommCodes[i].CommissionId)
@Html.HiddenFor(model => Model.CommCodes[i].CommissionId)
</td>
<td>@Html.DisplayFor(model => Model.CommCodes[i].Description)
@Html.HiddenFor(model => Model.CommCodes[i].Description)
</td>
<td>@Html.TextBoxFor(model => Model.CommCodes[i].Rate)
@Html.HiddenFor(model => model.CommCodes[i].Rate)
</td>
</tr>
}
</table>
<br /><br />
<button id="btnCommissionCodesSave" name="submit"type="submit"value="Save">Save</button>
<button id="btnCommissionCodesCancel">Cancel</button>
佣金清单项目的定义
[Serializable]
public struct CommissionListingItem
{
private System.Int32 _CommissionId;
private System.String _Description;
private System.Double _Rate;
public System.Int32 CommissionId{get{return _CommissionId;}}
public System.String Description{get{return _Description;}}
public System.Double Rate{get{return _Rate;}}
public CommissionListingItem(
System.Int32 CommissionId,
System.String Description,
System.Double Rate)
{
this._CommissionId = CommissionId;
this._Description = Description;
this._Rate = Rate;
}
模型变量在您的 lambda 表达式中应该是小写的。
@for (var i = 0; i < Model.CommCodes.Count; i++)
{
<tr>
<td>@Html.DisplayFor(model => model.CommCodes[i].CommissionId)
@Html.HiddenFor(model => model.CommCodes[i].CommissionId)
</td>
<td>@Html.DisplayFor(model => model.CommCodes[i].Description)
@Html.HiddenFor(model => model.CommCodes[i].Description)
</td>
<td>@Html.TextBoxFor(model => model.CommCodes[i].Rate)
@Html.HiddenFor(model => model.CommCodes[i].Rate)
</td>
</tr>
}
您的模型属于
类型
CommissionCodeModel
然而,在您的 post 操作中,您需要一个类型为
的模型
List<CommissionListingItem>
因此模型绑定器无法正确绑定到您的控制器模型。
您 struct
没有 setter,这是问题所在,因为 View 无法设置属性,因此所有属性都使用默认值发布:
[Serializable]
public struct CommissionListingItem
{
private System.Int32 _CommissionId;
private System.String _Description; private
System.Double _Rate;
public System.Int32 CommissionId
{
get
{
return _CommissionId;
}
set
{
_CommissionId = value;
}
}
public System.String Description
{
get
{
return _Description;
}
set
{
_Description = value;
}
}
public System.Double Rate
{
get{return _Rate;}
set { _Rate = value;}
}
}
过去 3-4 天我一直在努力寻找答案。我进行了很多搜索,并从已经问过基本相同问题的人那里得到了很多很好的答案。但是,none 的修复对我有用。
这是与工作相关的,因此某些 keywords/names 已更改。我已经逐步完成了程序,控制器正在将列表数据传递给视图,视图正在填充 Display/Textbox 和隐藏字段。但是,返回给控制器的模型具有正确数量的行项目,只是一切都是 0 或 null:
型号
namespace hereismynamespace
{
public class CommissionCodeModel
{
public CommissionCodeModel()
{
CommCodes = new List<CommissionListingItem>();
}
public List<CommissionListingItem> CommCodes { get; set; }
}
}
控制器
namespace hereismynamespace
{
public class CommissionCodeController : Controller
{
[HttpGet]
public ActionResult Manage()
{
var model = new CommissionCodeModel();
var list = CommissionListing.Get(false);
foreach (CommissionListingItem item in list)
{
model.CommCodes.Add(item);
}
return View(model);
}
[HttpPost]
public ActionResult SaveData(List<CommissionListingItem> CommCodes)
{
//do stuff here
return View();
}
}
}
查看
@using (Html.BeginForm("SaveData", "CommissionCode", FormMethod.Post))
{
<table id="commissionCodesPercentage" class="listing">
<thead>
<tr>
<th>Comm ID</th>
<th>Comm Code</th>
<th>Percent</th>
</tr>
</thead>
@for (var i = 0; i < Model.CommCodes.Count; i++)
{
<tr>
<td>@Html.DisplayFor(model => Model.CommCodes[i].CommissionId)
@Html.HiddenFor(model => Model.CommCodes[i].CommissionId)
</td>
<td>@Html.DisplayFor(model => Model.CommCodes[i].Description)
@Html.HiddenFor(model => Model.CommCodes[i].Description)
</td>
<td>@Html.TextBoxFor(model => Model.CommCodes[i].Rate)
@Html.HiddenFor(model => model.CommCodes[i].Rate)
</td>
</tr>
}
</table>
<br /><br />
<button id="btnCommissionCodesSave" name="submit"type="submit"value="Save">Save</button>
<button id="btnCommissionCodesCancel">Cancel</button>
佣金清单项目的定义
[Serializable]
public struct CommissionListingItem
{
private System.Int32 _CommissionId;
private System.String _Description;
private System.Double _Rate;
public System.Int32 CommissionId{get{return _CommissionId;}}
public System.String Description{get{return _Description;}}
public System.Double Rate{get{return _Rate;}}
public CommissionListingItem(
System.Int32 CommissionId,
System.String Description,
System.Double Rate)
{
this._CommissionId = CommissionId;
this._Description = Description;
this._Rate = Rate;
}
模型变量在您的 lambda 表达式中应该是小写的。
@for (var i = 0; i < Model.CommCodes.Count; i++)
{
<tr>
<td>@Html.DisplayFor(model => model.CommCodes[i].CommissionId)
@Html.HiddenFor(model => model.CommCodes[i].CommissionId)
</td>
<td>@Html.DisplayFor(model => model.CommCodes[i].Description)
@Html.HiddenFor(model => model.CommCodes[i].Description)
</td>
<td>@Html.TextBoxFor(model => model.CommCodes[i].Rate)
@Html.HiddenFor(model => model.CommCodes[i].Rate)
</td>
</tr>
}
您的模型属于
类型CommissionCodeModel
然而,在您的 post 操作中,您需要一个类型为
的模型List<CommissionListingItem>
因此模型绑定器无法正确绑定到您的控制器模型。
您 struct
没有 setter,这是问题所在,因为 View 无法设置属性,因此所有属性都使用默认值发布:
[Serializable]
public struct CommissionListingItem
{
private System.Int32 _CommissionId;
private System.String _Description; private
System.Double _Rate;
public System.Int32 CommissionId
{
get
{
return _CommissionId;
}
set
{
_CommissionId = value;
}
}
public System.String Description
{
get
{
return _Description;
}
set
{
_Description = value;
}
}
public System.Double Rate
{
get{return _Rate;}
set { _Rate = value;}
}
}