我用尽所有选项来检查为什么我的HttpPost参数始终为空。下面是我的模型,视图和控制器。通常,我有一个模型,其中包含以下(模型1)患者所用药物的所有详细信息。然后,我创建了一个具有一个属性的另一个模型,该属性是我的第一个模型(模型2)的列表。如HttpGet操作所示,将模型2传递到视图。我的HttpPost操作接受一个参数,该参数是Model 1的列表。此列表在我的视图的 View :
中的以下行中传递。using (Html.BeginForm("ClientChargeInput", "Home", new { @vm = Model.patients.ToList() }, FormMethod.Post, null))
有任何反馈意见吗?
模型
public class ControlledSubstancesEntity
{
public string facility { get; set; }
public string program_x_rrg_value { get; set; }
public string PATID { get; set; }
//More properties
}
将模型传递给View
public class ControlledSubsViewModel
{
public List<ControlledSubstancesEntity> patients { get; set; }
}
HttpGet控制器操作
[HttpGet]
public ActionResult ClientChargeInput(DateTime adminDate, string Facility)
{
ControlledSubsViewModel vm = new ControlledSubsViewModel();
//Some logic that populates vm
return View(vm);
}
查看
@model ControlledSubstancesChargeInput.Models.ControlledSubsViewModel
@{
ViewBag.Title = "ClientChargeInput";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@if (Model != null && Model.patients.Count() > 0)
{
using (Html.BeginForm("ClientChargeInput", "Home", new { @vm = Model.patients.ToList() }, FormMethod.Post, null))
{
<input type="submit" value="Charge Input" id="btnSubmit" class="btn btn-info btn-sm" onclick="PostCharge()" />
@*Fields are shown*@
@foreach (var p in Model.patients)
{
@Html.HiddenFor(model => p.facility)
@Html.HiddenFor(model => p.program_x_rrg_code)
@Html.HiddenFor(model => p.program_x_tx_setting_code)
}
}
}
else
{
@*@Html.Action("ShowReport");*@
}
HttpPost控制器操作
[HttpPost]
public ActionResult ClientChargeInput(List<ControlledSubstancesEntity> vm)
{
//On breakpoint vm is always null
}
答案 0 :(得分:1)
您可以尝试使用ControlledSubsViewModel
而不是List<ControlledSubstancesEntity>
类,然后可以使用vm.patients
进行逻辑编程。
因为您在ControlledSubsViewModel
视图中使用razor
,所以传递参数格式的格式将类似于ControlledSubsViewModel
。
[HttpPost]
public ActionResult ClientChargeInput(ControlledSubsViewModel vm)
{
//vm.patients use this property
}
由于Model.patients
是一个集合,因此可以将input
标签(隐藏或文本)用于循环集。
@if (Model != null && Model.patients.Count() > 0)
{
using (Html.BeginForm("ClientChargeInput", "Home",FormMethod.Post))
{
<input type="submit" value="Charge Input" id="btnSubmit" class="btn btn-info btn-sm" onclick="PostCharge()" />
for (int i = 0; i < Model.patients.Count; i++)
{
@Html.TextBoxFor(m => Model.patients[i].PATID);
@Html.TextBoxFor(m => Model.patients[i].facility);
@Html.TextBoxFor(m => Model.patients[i].program_x_rrg_value);
}
}
}
else
{
@*@Html.Action("ShowReport");*@
}
答案 1 :(得分:0)
即使您不想在页面上显示它们,仍然需要将ControlledSubstancesEntity
创建为hidden-fields
。
@using (Html.BeginForm("Index", "Home", FormMethod.Post, null))
{
for (int i = 0; i < Model.patients.Count; i++)
{
@Html.HiddenFor(x => Model.patients[i].facility)
@Html.HiddenFor(x => Model.patients[i].program_x_rrg_value)
@Html.HiddenFor(x => Model.patients[i].PATID)
}
<input type="submit" value="Charge Input" id="btnSubmit"
class="btn btn-info btn-sm" onclick="PostCharge()" />
}
然后将ControlledSubsViewModel
用作HttpPost操作方法中的参数。