我想在mvc4 razor视图中显示一个下拉列表,其中的值将取决于库存中的项目。 这是我的观点:
@using (Html.BeginForm())
{
<div class="panel-group">
@foreach (var m in Model)
{
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" id="#accordion" data-parent="#accordion" href="#@m.Categories.ID.ToString()">
@m.Categories.Name <span class="badge">@m.Categories.ItemCount</span>
</a>
</h4>
</div>
<div id="@m.Categories.ID.ToString()" class="panel-collapse collapse">
<div class="panel-body">
<ul class="list-group">
@foreach (var i in m.Items)
{
using (Html.BeginForm("AddToCart", "Cart"))
{
<li class="list-group-item">
@i.Name | Price £@i.Price
<div class="pull-right">
<input type="submit" class="btn btn-success" id="addButton" style="margin-bottom: 5px;" value="Add"/>
@Html.Hidden("ItemId", @i.Id)
@Html.Hidden("categoryId", @m.Categories.ID)
@Html.Hidden("returnUrl", Request.Url.PathAndQuery)
</div>
</li>
}
}
</ul>
</div>
</div>
</div>
}
</div>
}
现在,对于m.Items中的每个项目,都有一个名为Stock的属性,因此在视图中,我想要为每个项目添加一些值为0到Stock值的下拉列表。知道如何填充特定的下拉列表吗?
这就是我正在做的事情:
在viewmodel中我又添加了一个属性:
public List<SelectListItem> StockSelectList;
在控制器中我正在设置属性:
List<SelectListItem> itemsInStockSelectList = new List<SelectListItem>();
for (int x = 0; x < itemsList.Items.Count; x++)
{
var selectItem = new SelectListItem();
selectItem.Text = itemsList.Items[x].InStockNow.ToString();
selectItem.Text = itemsList.Items[x].InStockNow.ToString();
itemsInStockSelectList.Add(selectItem);
}
使用这种方法我正在设置值,但我需要为类别中的每个项目设置,也许我可以再使用一个属性来获取SelectItemList的categoryID和itemID?
在视图中我尝试了这种方法:
@Html.DropDownListFor(k => i.InStockNow, m.StockSelectList)
正如我所说,我为所有项目获得了相同的值。
答案 0 :(得分:0)
您需要创建一个SelectList
var SelectList = new List<SelectListItem>();
for (int x = 0; x < i.stock; x++)
{
var selectItem = new SelectListItem()
selectItem.Text = x;
selectItem.Value = x;
SelectList.Add(selectItem);
}
然后用它来渲染
@Html.DropDownListFor(i => i.Stock, SelectList)
答案 1 :(得分:0)
你可以使用一些WebHelper类。
类似的东西,
public static SelectList CreateSelectList<T>(T firstItem, IEnumerable<T> repository,
string dataValueField, string dataTextField) where T : class
{
var items = new List<T>();
if (firstItem != null)
{
items.Add(firstItem);
}
items.AddRange(repository);
var selectList = new SelectList(items, dataValueField, dataTextField);
return selectList;
}
然后将ViewBag放在选择列表
上ViewBag.Itmes = WebHelper.CreateSelectList(null, itemsInStockSelectList, "ItemId", "Text");
将ItemIdToSave
添加到您的模型中然后只使用DropDownListFor
@Html.DropDownListFor(model => model.ItemIdToSave, (SelectList)ViewBag.Itmes)
答案 2 :(得分:0)
尝试将您的转换为foreach
List<SelectListItem> ls = new List<SelectListItem>();
foreach(var temp in itemsList.Items)
{
ls.Add(new SelectListItem() { Text = temp.InStockNow.ToString(), Value = temp.InStockNow.ToString() });
}
答案 3 :(得分:0)
如果你的模型是这个
public class TestModel
{
public List<Tuple<int, string>> Items { get; set; }
public TestModel()
{
Items = new List<Tuple<int, string>>();
Items.Add(new Tuple<int, string>(1, "a"));
Items.Add(new Tuple<int, string>(2, "b"));
Items.Add(new Tuple<int, string>(3, "c"));
Items.Add(new Tuple<int, string>(4, "d"));
Items.Add(new Tuple<int, string>(5, "e"));
Items.Add(new Tuple<int, string>(6, "f"));
Items.Add(new Tuple<int, string>(7, "g"));
}
}
你的控制器动作就是这个
public ActionResult Test()
{
var model = new TestModel();
return View(model);
}
你的观点是这个
@model MVC5Empty.Models.TestModel
@{
ViewBag.Title = "Test";
}
<h2>Test</h2>
<ul>
@foreach (var item in Model.Items)
{
<li>@item.Item1 -- @Html.DropDownList(item.Item1 + "ddlvalue", Model.Items.Where(i => i.Item1 <= item.Item1).Select(i => new SelectListItem() { Text = i.Item2, Value = i.Item2 }))</li>
}
</ul>
您应该能够更改.Where子句以满足您的业务逻辑需求,在这种情况下,Item1必须小于或等于当前循环项(注意:Tuple只是创建快速对象的一种方式)< / p>
答案 4 :(得分:0)
如果我理解你的问题,这可能会有所帮助。
样本模型
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int Stock { get; set; }
public List<SelectListItem> StockList { get; set; }
}
Home Controller-&gt;指数行动
public ActionResult Index()
{
List<Product> products = new List<Product>()
{
new Product{ Id=1, Name="Prod1", Stock=20 },
new Product{ Id=2, Name="Prod2", Stock=10 },
};
foreach (var item in products)
{
if (item.StockList == null)
{
item.StockList = new List<SelectListItem>();
}
for (int i = 0; i <= item.Stock; i++)
{
var selectItem = new SelectListItem();
selectItem.Text = i.ToString(); selectItem.Value = i.ToString();
item.StockList.Add(selectItem);
}
}
return View(products);
}
将获得列表的发布操作方法
[HttpPost]
public ActionResult Index(List<Product> products)
{
//Do the processing on the list.
return View();
}
这是索引视图
@model IList<Notsurewhattoname.Controllers.Product>
@{
ViewBag.Title = "Home Page";
}
@using(Html.BeginForm("Index", "Home", FormMethod.Post))
<table>
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
<td>@Html.LabelFor(m => m[i].Name) </td>
<td>@Html.DropDownListFor(m => m[i].Stock, Model[i].StockList) </td>
</tr>
}
</table>
<input type="submit" value="Submit" />
}
示例输出
答案 5 :(得分:0)
我在你的代码中假设..
@foreach (var i in m.Items)
'i'的InStockNow属性应该是下拉列表中应显示的最大值。
<select name="@Html.NameFor(model => i.InStockNow)" id="@Html.IdFor(model => i.InStockNow)">
@for (var count = 0; count < i.InStockNow; count++)
@if (count == InStockNow)
{
<option selected="selected" value="@count">@count</option>
}
else
{
<option value="@count">@count</option>
}
</select>
我不确定我选择的ID是否合适,但我认为您可以看到如何做出正确的选择。
我建议你尝试编辑模板。您应该能够为每个循环获取所有代码,并使其适用于单个项目。
答案 6 :(得分:0)
您的代码:
List<SelectListItem> itemsInStockSelectList = new List<SelectListItem>();
for (int x = 0; x < itemsList.Items.Count; x++)
{
var selectItem = new SelectListItem();
selectItem.Text = itemsList.Items[x].InStockNow.ToString();
selectItem.Text = itemsList.Items[x].InStockNow.ToString();
itemsInStockSelectList.Add(selectItem);
}
如果您没有注意到,则设置selectItem.Text
两次,而不是设置selectItem.Value
。修复此问题应该为每个项目提供不同的值。一旦你的值正确,你应该使用该信息来查找categoryId并在你的控制器中处理returnUrl。
答案 7 :(得分:0)
如果你有一个不会改变的硬编码列表,你可以试试这个。
@Html.DropDownListFor(model => model.Purpose,
new List<SelectListItem> {
new SelectListItem(){Text="SEX" ,Value="SEX",Selected=false},
new SelectListItem(){Text="Male" ,Value="M"},
new SelectListItem(){Text="Female" ,Value="F"}
}
)
但是看看你的代码看起来你需要模型中的数据,更好的方法就是@Nilesh所示 或者如果您确定在模型中永远不会得到空值,那么您可以使用
设置数据@Html.DropDownListFor(model => model.Purpose,
new List<SelectListItem> {
new SelectListItem(){Text=@Model.Name ,Value=@Model.Value}
}
)