我有一个预付费产品销售。 经销商可以有子经销商 经销商可以为每个产品定价 他对每种产品都有最大的义务。 现在我喜欢在销售页面的 mvc c# 站点项目中有两个 DropDowmList 当我从第一个 ddl chack 产品时,我希望我的其他 ddl(他必须销售多少产品)从我的数据库连接。
编辑: 例如经销商有三种产品要销售: 产品 A - 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 连接在一起。
编辑:
我尝试像其他 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)从 Controller 传输到 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);
}
在你的强类型 View 中,
@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库到这个 View (或布局 View ),我们将把这个 java 脚本添加到我们的 View 。
<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 进行 GET 调用。方法(在我们包含的 jquery 库中编写)并以 JSON
格式获取结果并对其进行解析并将其附加到第二个下拉列表中。
假设 GetSaleNumbers
是 Product
Controller 中的一个 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);
}
关于c# - 在两个下拉列表 mvc 4 之间连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12249335/