发布

时间:2018-06-01 08:00:25

标签: asp.net-mvc-4 html-helper

我希望能有一些关于我在保留邮政后的下拉列表中的价值的问题的指导(razor)

我有一个简单的页面:

    @model testContingency.Models.ListByWardDD

@{
    ViewBag.Title = "TestDropDowns";
}

<h2>TestDropDowns</h2>

<div>

    @Html.DropDownList("HospModel", Model.Hospital,  new { @onchange = "ChangeHospital(this.value)" }) 
    @Html.DropDownList("WardModel", Model.Wards)

    <script type="text/javascript">

        function ChangeHospital(val) {
            window.location.href = "/PatientListByWardDD/TestDropDowns?hospID=" + val;
        }



    </script>

</div>

这里是控制器

public ActionResult TestDropDowns(int? hospID)
    {
        PASInpatientRepository pasRepo = new PASInpatientRepository();
        var returnModel = new ListByWardDD();     
        var HospitalData = pasRepo.GetPatientHospitalsEnum();
        returnModel.Hospital = pasRepo.GetHopspitalListItems(HospitalData);
        var WardData = pasRepo .GetPatientWardsEnum(hospID);
        returnModel.Wards = pasRepo.GetWardListItems(WardData);
        ViewBag.HospSearch = hospID;
        return View(returnModel);
    }

在控制器PASInpatientRepository()中与缓存数据库通信。它传回公共IEnumerable&lt; SelectListItem&gt; GetHopspitalListItems。它调用在缓存数据库中编写的存储过程(本质上与sql存储过程相同)。这一切都以自己粗糙的方式运作良好。

我遇到的问题是,当我选择下拉列表@Html.DropDownList("HospModel", Model.Hospital, new { @onchange = "ChangeHospital(this.value)" })并调用控制器刷新Wards下拉列表时,我想保留我在医院下拉列表中选择的值。我尝试了几种不同的方式,但我承认,我有点卡住了。我发现的大多数例子都是强类型的。

正如我所提到的,我是MVC的新手,但是对于如何解决这个问题的任何建议,或者有关改进我的代码的建议都非常感谢。

1 个答案:

答案 0 :(得分:0)

所以我不确定Hospital属性是什么样的,但我会假设每个属性都有一个唯一的ID。 此外,要将发布的数据绑定到视图模型,您需要在视图中使用表单。要创建下拉列表,请使用DropDownListFor - 帮助程序。这样,数据将在提交表单后绑定回您的模型。

所以你的观点可能看起来像这样

@model testContingency.Models.ListByWardDD

@{
    ViewBag.Title = "TestDropDowns";
}

<h2>TestDropDowns</h2>

<div>
    @using (Html.BeginForm("TestDropDowns", "YourController", FormMethod.Post))
    {
        @Html.DropDownListFor(x => x.HospitalID, Model.Hospital)
        @Html.DropDownListFor(x => x.WardID, Model.Wards)
        <input type="submit" value="send" />
}    
</div>

您的ViewModel testContigency.Models.ListByWardDD必须至少具有以下属性

public class ListByWardDD {
    public int HostpitalID { get;set; }
    // the value of the SelectListItem-objects should be the hospital ID
    public IEnumerable<SelectListItem> Hospital { get;set; }

    public int WardID { get;set; }
    // the value of the SelectListItem-objects should be the ward ID
    public IEnumerable<SelectListItem> Wards { get;set; }
}

发布表单后(为简单起见,我添加了一个按钮来发送表单并将javascript部分保留),将调用控制器的TestDropDowns方法(需要填写BeginForm-Helper)。该方法期望将ListByWardDD类型的对象作为参数,框架将自动为您填充值。

[HttpPost]
public ActionResult TestDropDowns(ListByWardDD viewModel) {
    // your code here, viewModel.HospitalID should contain the selected value
}

注意:提交表单后,属性HospitalWards将为空。如果需要再次显示表单,则需要重新填充这些属性。否则,您的下拉列表为空。

我尽力发布有效代码,但我没有编译或测试它。