【问题标题】:Asp.net razor textbox array for list items列表项的 Asp.net razor 文本框数组
【发布时间】:2014-06-10 21:04:00
【问题描述】:

我无法找到或弄清楚如何获取项目列表(纸杯蛋糕)并将它们显示在带有数量字段的剃须刀中。

发生的情况是我无法获取列表中每个纸杯蛋糕数量的值。你能在 Razor 中做文本框数组吗?

查看

<div class="form-group">
    <label>Cupcakes</label>
    @foreach (var cupcake in Model.CupcakeList)
    {
        @Html.TextBox("CupcakeQuantities", cupcake.Id)  @cupcake.Name <br/>
    }
</div>

型号

public List<Cupcake> CupcakeList { get; set; }
public List<int> CupcakeQuantities { get; set; }

控制器

public ActionResult Create()
{
    var model = new PartyBookingModel()
    {
        CupcakeList = db.Cupcakes.ToList(),
        CupcakeQuantities = new List<int>()
    };

    return View(model);
}

纸杯蛋糕(实体)

public class Cupcake
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal PerDozen { get; set; }
}

【问题讨论】:

  • 您的问题似乎不一致,您在模型中显示 CupcakeQuantites,但在控制器中您正在填充 CupcakeSelection 数组。您能否指定您的数量字段在哪里?
  • 对不起,错字。应该是 CupcakeQuantities。问题已更新。

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


【解决方案1】:

您必须使用索引,而不是 foreach 才能工作。

@for (int i = 0; i < Model.CupcakeList.Count; i++)
{
    @Html.TextBoxFor(x=>Model.CupcakeQuantities[i]) @Model.CupcakeList[i].Name <br/>
}

这将创建顺序命名+编号的条目,这些条目将在回发时重新组合回模型中。

我意识到这可能看起来像“为什么 foreach 不起作用?”,但对于 foreachTextBoxFor 没有足够的反射信息(因为它只是一个对象),而数组索引是通过Model.CupcakeQuantities[i] 表达式的反射提取。

接收控制器方法应该与传递给视图的模型相同:

例如

[HttpPost]
public ActionResult(PartyBookingModel model)

【讨论】:

  • 是的,这就是我想要弄清楚的。但我不知道如何“捕获”控制器中发布的值。请问你的回答能说明吗?
  • 添加了接收控制器方法的示例。当您将脚手架向导用于 EF 模型 + 创建时,您通常会得到一个很好的示例来构建。
  • 刚刚意识到我在数组中放置了错误的模型属性...现在固定为您的数量 :) 如果 CupCake 模型包含数量属性,而不是有 2 个列表,它会更干净。例如添加从CupCake 派生的CupCakeCreate 模型并添加Qty 属性是一种选择。
  • 我不确定如何在当前模型/视图/控制器中实现 CupCakeCreate 模型。你的想法是有道理的,但我对此有点菜鸟:)
  • 是的,我的错。都是凭记忆打出来的。添加基本​​的 .Count :)
【解决方案2】:

试试这个方法:

查看:

@for (int i = 0; i < Model.Count; i++)
{
    @Html.HiddenFor(x=>Model[i].Id) @Model[i].Name  
    @Html.TextBoxFor(x => Model[i].Quantity) <br/>
}

型号:

public class CupcakeViewModel
{
   public int Id {get;set;}
   public string Name {get;set;}
   public int Quantity {get;set;}   
}

控制器:

public ActionResult Create()
{
    var model = db.Cupcakes.Select(c => new CupcakeViewModel {
                                                Id = c.Id,
                                                Name = c.Name,
                                                Quantity = 0 
                           })
                           .ToList();

    return View(model);
}

[HttpPost]
public ActionResult Create(CupcakeViewModel[] cakes)
{
     //Save choosen cakes
}

【讨论】:

  • 我收到了带有“ProjectTest.Domain.Cupcake”文本的文本框。
  • @Html.TextBoxFor(x=>Model.CupcakeList[i].Id) 将 Id 放入文本框的值中,我需要它为空,因为用户输入了多少每个他们想要的。我将其更改为 @Html.TextBoxFor(x=>Model.CupcakeList[i].Id, null) 但它不允许我将 int (Id) 分配给字符串。 :(
  • 您希望允许用户更改哪个属性?如果是 Id - 为什么它应该是空的?为了让它空,你应该像这样传递Value = ""的对象:@Html.TextBoxFor(x=&gt;Model.CupcakeList[i].Id, new { Value = "" })
  • 我尝试制作表单的方式是 1) 调用数据库,获取纸杯蛋糕列表 2) 显示纸杯蛋糕的数量字段,供用户输入他们想要的每个纸杯蛋糕的数量 3) 获取值并构建每个数量的订单。
  • 谢谢,其实我复制了你的代码作为模板)))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
相关资源
最近更新 更多