mvc4 dropdownlistfor设置值从0到可用库存

时间:2014-03-11 23:36:20

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

我想在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)

正如我所说,我为所有项目获得了相同的值。

8 个答案:

答案 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" />
}

示例输出

First drop down contains 21 values

Second drop down contains 11 values

Quick watch

答案 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}

                                }
                            )