如何在MVC中解决ListBox中的“null”值

时间:2015-12-29 12:00:57

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

Salaamun Alekum

我从MVC中的ListBox获取null值的行动

  

HR_TP_Supplier null Assignment1MedicineMasterPharmacy.Models.HR_TP_Supplier

这是CSHTML代码

<div class="form-group">
            @Html.LabelFor(model => model.HR_TP_Supplier, "Supplier", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">

                @Html.ListBox("HR_TP_Supplier", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.HR_TP_Supplier, "", new { @class = "text-danger" })
            </div>
        </div>

这是C#动作代码

public ActionResult Create([Bind(Include = "MedicineID,Med_Name,Med_code,Generic_Name,Trade_Price,Retail_Price,Accounting_Unit,Nature,THERAPEUTIC_Group,Dosage,Description,Active,Enteredby,Enteredon,ClientID,HR_TP_Supplier")] PH_tmedicine_masterSubmit pH_tmedicine_master)
        {

这是实体类

namespace Assignment1MedicineMasterPharmacy.Models
{
    using System;
    using System.Collections.Generic;

    public partial class PH_tmedicine_masterSubmit
    {
        public int MedicineID { get; set; }
        public string Med_Name { get; set; }
        public string Med_code { get; set; }
        public Nullable<int> Generic_Name { get; set; }
        public Nullable<int> Trade_Price { get; set; }
        public Nullable<int> Retail_Price { get; set; }
        public Nullable<int> Accounting_Unit { get; set; }
        public Nullable<int> Nature { get; set; }
        public Nullable<int> THERAPEUTIC_Group { get; set; }
        public string Dosage { get; set; }
        public string Description { get; set; }
        public string Active { get; set; }
        public string Enteredby { get; set; }
        public Nullable<System.DateTime> Enteredon { get; set; }
        public Nullable<int> ClientID { get; set; }
        public virtual HR_TP_Supplier HR_TP_Supplier { get; set; }
    }
}

我应该如何解决它我希望ListBox中的多个选定值在列表或数组或字符串之类的任何内容

谢谢

1 个答案:

答案 0 :(得分:3)

在您的视图中使用ORM创建的实体并不是一个好主意,尤其是当您的视图多于一个或两个字段时。 您应该为视图创建视图模型。

HR_TP_Supplier实体上的PH_tmedicine_masterSubmit属性不是集合类型。不确定为什么你想要多选列表框。无论如何,如果你真的想要视图中的多选列表框,你可以添加一个字符串数组的属性来存储多选列表框中的选定项目。

public class MedicineMasterVm
{      
  public string[] SelectedSuppliers { get; set; }  
  public IEnumerable<SelectListItem> Suppliers { get; set; }    

  //Add Other needed properties here
  public string Med_Name { get; set; }
  public string Med_code { get; set; }
}

在你的GET操作中,你应该创建一个这样的对象,加载Suppliers属性并将其发送到视图。

public ActionResult Create()
{
    var vm = new MedicineMasterVm();
    //The below code is hardcoded for demo. you mat replace with DB data.
    vm.Suppliers= new[]
    {
      new SelectListItem { Value = "1", Text = "Supplier 1" },
      new SelectListItem { Value = "2", Text = "Supplier 2" },
      new SelectListItem { Value = "3", Text = "Supplier 3" }
    };  
    return View(vm);
}

现在在您的视图中,强类型为MedicineMasterVm类,

@model UserViewModel
<h2>Create Medicine </h2>
@using (Html.BeginForm())
{
  <label>Name</label> @Html.TextBoxFor(s=>s.Med_Name)
  <label>Code</label> @Html.TextBoxFor(s=>s.Med_Code)
  <label>Suppliers</label> @Html.ListBoxFor(s => s.SelectedSuppliers ,Model.Suppliers)
  <input type="submit" value="Save" />
}

现在,当用户发布此表单时,您将获得视图模型的SelectedSuppliers属性中的Selected Items值。读取已发布视图模型的属性值,并使用它来构建实体对象并保存。

[HttpPost]
public ActionResult CreateUser(MedicineMasterVm model)
{
    if (ModelState.IsValid)
    {
        string[] supplierArray= model.SelectedSuppliers  ;
        //check items now
        //do your further things and follow PRG pattern as needed
    }
    //reload the Suppliers property again in the ViewModel before returning to the View
    return View(model);
}

如果您想要单个选择正常下拉列表,请将字符串数组更改为字符串或整数,并按照this post中的说明使用它。