在MVC中将数据从HttpGet传递到View到HttpPost

时间:2018-09-06 17:04:03

标签: c# asp.net asp.net-mvc razor

我用尽所有选项来检查为什么我的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
    }

2 个答案:

答案 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操作方法中的参数。

enter image description here (点击图片可全屏查看)