【问题标题】:Pass selected value in dropdownlist from view to controller when form post表单发布时将下拉列表中的选定值从视图传递到控制器
【发布时间】:2016-07-18 04:44:54
【问题描述】:

我有这些模型和一个视图模型。当表单发布以创建条目时,WardIDDoctorID 的选定值在控制器 POST 方法中变为零。

查看代码

@model NewClient.HospitalMgt.ViewModel.PatientAdmissionViewModel
.... 
@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <div class="editor-label">
            @Html.LabelFor(model => model.Admission.WardID, "Ward")
        </div>
        <div class="editor-field">
            @Html.DropDownList("WardID", String.Empty)
            @Html.ValidationMessageFor(model => model.Admission.WardID)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Admission.DoctorID, "Doctor")
        </div>
        <div class="editor-field">
            @Html.DropDownList("DoctorID", String.Empty)
            @Html.ValidationMessageFor(model => model.Admission.DoctorID)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Patient.PatientName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Patient.PatientName)
            @Html.ValidationMessageFor(model => model.Patient.PatientName)
        </div>
        .... //more controls for properties of Patient

        <div class="editor-label">
            @Html.LabelFor(model => model.Admission.AdmissionNumber)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Admission.AdmissionNumber)
            @Html.ValidationMessageFor(model => model.Admission.AdmissionNumber)
        </div>
        .... //more controls for properties of Admission
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

控制器代码

public ActionResult Create()
{
    ViewBag.WardID = new SelectList(db.Wards, "WardID", "WardNumber");
    ViewBag.DoctorID = new SelectList(db.Doctors, "DoctorID", "DoctorName");
    return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(PatientAdmissionViewModel Id)
{
    if (ModelState.IsValid)
    {
        var c = new Patient()
        {
            Address = Id.Patient.Address,
            ContactNumber = Id.Patient.ContactNumber,
            EmergencyContact = Id.Patient.EmergencyContact,
            PatientName = Id.Patient.PatientName,
        };
        var a = new Admission()
        {
            AdmissionNumber = Id.Admission.AdmissionNumber,
            AdmissionDate = Id.Admission.AdmissionDate,
            **WardID = Id.Admission.WardID, //becomes zero 
            DoctorID = Id.Admission.DoctorID //becomes zero** 
        };
        db.Patients.Add(c);
        db.Admissions.Add(a);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.WardID = new SelectList(db.Wards, "WardID", "WardNumber", Id.Admission.WardID);
    ViewBag.DoctorID = new SelectList(db.Doctors, "DoctorID", "DoctorName", Id.Admission.DoctorID);
    return View(Id);
}

模型和视图模型

//[NotMapped]
public class PatientAdmissionViewModel 
{
    public Patient Patient { get; set; }
    public Admission Admission { get; set; }
}

public class Patient
{
    public int PatientID { get; set; }
    [Required(ErrorMessage = "A Patient Name is required")]
    public string PatientName { get; set; }
    public string Address { get; set; }
    [Required(ErrorMessage = "A Contact Number is required")]
    public string ContactNumber { get; set; }
    public string EmergencyContact { get; set; }
    public virtual Ward Ward { get; set; }
}

public class Admission
{
    public int AdmissionID { get; set; }
    public string AdmissionNumber { get; set; }
    public Nullable<int> PatientID { get; set; }
    public int WardID { get; set; }
    public int DoctorID { get; set; }
    public System.DateTime AdmissionDate { get; set; }
    public virtual Ward Ward { get; set; }
    public virtual ICollection<PatientPayment> PatientPayments { get; set; }
}

【问题讨论】:

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


    【解决方案1】:

    您使用 @Html.DropDownList("WardID", String.Empty)@Html.DropDownList("DoctorID", String.Empty) 分别生成带有 name="WardID"name="DoctorID" 的输入,但您的模型不包含具有这些名称的属性(但它确实包含一个名为 Admission 的属性,其中包含那些属性)。

    您的“视图模型”并不是真正的视图模型(视图模型不应包含在编辑时属于数据模型的属性)。您的视图模型还应该包含SelectList 的属性,以便您可以强绑定到您的模型。您的视图模型需要是

    public class PatientAdmissionViewModel
    {
        [Display(Name = "Ward"]
        [Required(ErrorMessage = "Please select a ward")]
        public int? SelectedWard { get; set; }
        [Display(Name = "Doctor"]
        [Required(ErrorMessage = "Please select a doctor")]
        public IEnumerable<SelectListItem> WardList { get; set; }
        public int? SelectedDoctor { get; set; }
        public IEnumerable<SelectListItem> DoctorList { get; set; }
    
        public string PatientName { get; set; }
        ... // other properties of Patient that you need in the view
    
        public string AdmissionNumber{ get; set; }
        ... // other properties of Admission that you need in the view
    }
    

    并在 GET 方法中,初始化视图模型的实例,设置其属性并将其返回给视图

    public ActionResult Create()
    {
        var model = new PatientAdmissionViewModel()
        {
            WardList = new SelectList(db.Wards, "WardID", "WardNumber"),
            DoctorList = new SelectList(db.Doctors, "DoctorID")
        };
        return View(model);
    }
    

    在视图中

    @Html.DropDownListFor(m => m.SelectedWard, Model.WardList, "-Please select-")
    ....
    @Html.DropDownListFor(m => m.SelectedDoctor, Model.DoctorList, "-Please select-")
    

    最后,在 POST 方法中,初始化数据模型的新实例,根据视图模型中的值设置它们的属性并保存数据模型。

    我还建议您阅读What is ViewModel in MVC? 的答案。

    【讨论】:

    • 您试图对我的回答进行编辑。那个编辑是错误的,我拒绝了。如果您在 POST 时遇到错误,请参考 this question/answer
    【解决方案2】:

    而不是这个

    @Html.DropDownList("WardID", String.Empty)
    @Html.DropDownList("DoctorID", String.Empty)
    

    在视图中使用它

    @Html.DropDownListFor(model => model.Admission.WardID, (SelectList)ViewBag.WardID, "--Select One--")
    @Html.DropDownListFor(model => model.Admission.DoctorID, (SelectList)ViewBag.DoctorID, "--Select One--")
    

    在控制器上使用它

     WardID = Id.Admission.WardID, 
     DoctorID = Id.Admission.DoctorID 
    

    【讨论】:

    • 也会试试这个,专家的大力帮助让代码变得有趣
    • 属性的验证和顺序必须以其他方式匹配 具有键 '' 的 ViewData 项的类型为 'System.Int32' 但必须是类型 'IEnumerable 错误来了`public IEnumerable WardList { get;放; } [Required(ErrorMessage = "请选择一个病房")] public int? SelectedWard { 得到;放; } 公共 IEnumerable DoctorList { 获取;放; } [Required(ErrorMessage = "请选择医生")] public int? SelectedDoctor { 得到;放; }`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多