【问题标题】:connecting between two dropdownlist mvc 4在两个下拉列表 mvc 4 之间连接
【发布时间】:2017-12-24 06:58:46
【问题描述】:

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

编辑: 例如,经销商要销售三种产品: productA - 5 件待售 产品B - 20 产品C - 15 当他在第二个 ddl 或 textboxForNumber(min,max) 上选择 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 连接在一起。

编辑:

我尝试使用 ViewBag 来执行此操作,就像其他 ddl 资源列表一样。

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>

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

【问题讨论】:

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


    【解决方案1】:

    首先,我将摆脱ViewBag 以将数据(用于下拉列表)从控制器传输到视图。我会将它添加为我的 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 来加载要出售的数字。我们将在此视图(或布局视图)中包含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 格式化并解析它并将其附加到第二个下拉列表中。

    假设GetSaleNumbers 是Product 控制器中的一个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);
    } 
    

    【讨论】:

    • 如果我想在他选择一种产品后进行求和逻辑也是一样的(例如 - 如果他有义务说 100 美元,他可以销售 50Pr​​oductA 或 30productB 等)?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2020-11-29
      相关资源
      最近更新 更多