两个下拉列表之间的连接mvc 4



我有一笔预付费产品销售。经销商可以有次级经销商经销商可以为每种产品设定价格他对每种产品都有最大的义务。现在我喜欢在我的mvc c#网站项目的销售页面上有两个DropDowmList当我从第一个ddl获取产品时,我希望我的另一个ddl(他必须销售多少产品)从我的数据库连接。

编辑:例如,经销商有三种产品要销售:productA-5台待售产品B-20产品C-15当他在第二个ddl或文本框ForNumber(最小值,最大值)上选择productB时,他应该看到从1到20 的范围

我尝试创建这样一个新模型:

    public int ProductObligoByDealerID { get; set; }
    public int DealerID { get; set; }
    public virtual Dealer Dealer { get; set; }
    public int ProductID { get; set; }
    public virtual Product Product { get; set; }
    public uint MonthObligo { get; set; }

但我无法将这两个ddl连接在一起。

编辑:

我试着像其他ddl资源列表一样使用ViewBag来实现这一点。

var AllObligoProdact = db.ProductObligo.Where(p => p.DealerID == currentDealer.DealerID);
foreach (var item in AllObligoProdact)
 ViewBag.ProductObligo[item.Product.ProductID].max = item.MonthObligo;

并且在cshtml侧中

    <div class="editor-label">
        @Html.LabelFor(model => model.DealerProductID)
    </div>
    <div class="editor-field">
        @Html.DropDownList("DealerProductID", string.Empty)
        @Html.ValidationMessageFor(model => model.DealerProductID)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.NumOfMonth)
    </div>
    <div class="editor-field">
        @*Html.EditorFor(model => model.NumOfMonth)*@
         @Html.TextBoxFor(model => model.NumOfMonth , new {type="number",min="0",max=ViewBag.ProductObligo[Model.DealerProductID].max })
             @*.DropDownList("NumOfMonth", string.Empty)*@
        @Html.ValidationMessageFor(model => model.NumOfMonth)
    </div>

但我仍然一无所获:/在数据库中使用一个新表是个好主意,或者有更好的方法可以做到这一点?

首先,我将去掉ViewBag,将数据(用于Dropdownlist)从控制器传输到View。我会将其添加为ViewModel的属性。

public class ProductSale
{  
   public IEnumerable<SelectListItem> Products{ get; set; }
   public int SelectedProduct { get; set; }
   public IEnumerable<SelectListItem> SaleNumbers{ get; set; }
   public int SelectedSaleNumber { get; set; }
   //Other Existing properties also.
  public ProductSale()
  {
     Products=new List<SelectListItem>();
     SaleNumbers=new List<SelectListItem>();
  }
}

现在,在我的GET操作中,我会设置Products集合,并将其发送到View,

public ActionResult Add()
{
  var vm=new ProductSale();
  //The below code is hardcoded for demo. you mat replace with DB data.
  vm.Products= new[]
  {
    new SelectListItem { Value = "1", Text = "Product A" },
    new SelectListItem { Value = "2", Text = "Dealer B" },
    new SelectListItem { Value = "3", Text = "Product C" }
  };      
  return View(vm);
}

在你的强类型视图中,

@model ProductSale
@using(Html.Beginform())
{
  @Html.DropDownListFor(x => x.SelectedProduct, 
     new SelectList(Model.Products, "Value", "Text"), "Select Product")
  @Html.DropDownListFor(x => x.SelectedSaleNumber, 
     new SelectList(Model.SaleNumbers, "Value", "Text"), "Select Number to sell")
  <input type="submit" />
}

现在,当用户从下拉列表中选择一种产品时,我们需要一些javascript来加载要销售的数字。我们将在这个视图(或Layout视图)中包含jQuery库,并将这个java脚本添加到我们的视图中。

<script type="text/javascript">
    $(function () {
        $("#SelectedProduct").change(function () {
            var self = $(this);
            var items="";
            $.getJSON("@Url.Action("GetSaleNumbers","Product")/"+self.val(),
                                                                function(data){
              $.each(data,function(index,item){
                items+="<option value='"+item.Value+"'>"+item.Text
                                                                    +"</option>";
              });
              $("#SelectedSaleNumber").html(items);
            });
        });
    });
</script>

它所做的是,它监听第一个下拉列表的change事件,当它发生时,它会使用getJSON方法(写在我们包含的jquery库中)进行get调用,并以JSON格式获得结果,然后对其进行解析,并将其附加到第二个下拉列表中。

假设GetSaleNumbersProduct控制器中的Action方法,它接受产品的id并以JSON格式发送该产品的所有产品销售编号。

public ActionResult GetSaleNumbers(int id)
{
  List<SelectListItem> saleNumbers=new List<SelectListItem>();
  //The below code is hardcoded for demo. you mat replace with DB data 
  //based on the  input coming to this method ( product id)
  saleNumbers.Add(new SelectListItem { Value="1" , Text="1" }, 
                  new SelectListItem { Value="2" , Text="2" }, 
                  new SelectListItem { Value="3" , Text="2" }
                 );
  return Json(saleNumbers,JsonRequestBehavior.AllowGet);
} 

您必须编写javascript,并在第一个下拉列表更新(选择更改)时对服务器进行ajax调用,以从数据库中获取数据,并用这些数据更新第二个下拉列表。

最新更新