帖子列表

问题描述:

形式是这样的:https://gyazo.com/289a1ac6b7ecd212fe79eec7c0634574帖子列表

视图模型:

public class ProductViewModel 
{ 
    public string Product { get; set; } 
    public IEnumerable<SizeColorQuantityViewModel> SizeColorQuantities { get; set; } 
} 
public class SizeColorQuantityViewModel 
{ 
    public string ColorId { get; set; } 
    public List<SizeAndQuantity> SizeAndQuantities { get; set; } 
} 
public class SizeAndQuantity 
{ 
    public int SizeId { get; set; } 
    public int Quantity { get; set; } 
} 

查看:

@model ProjectSem3.Areas.Admin.Models.ProductViewModel 
@{ 
    ViewBag.Title = "Create"; 
    Layout = "~/Areas/Admin/Views/Shared/_Layout.cshtml"; 
    string[] ListColor = { "Red", "Blue" }; 
    string[] ListSize = { "S", "M", "L", "XL" }; 
} 
    @for (var i = 0; i < ListColor.Length; i++) 
    { 
    <div class="form-group"> 
     <label class="col-md-2 control-label">Color:</label> 
     <div class="col-md-2"> 
      @Html.TextBox("[" + i + "].ColorId", null, new { @Value = ListColor[i], @class = "form-control", @readonly = "readonly" }) 
     </div> 
    </div> 
    <div class="form-group"> 
     <label class="col-md-2 control-label">Size and Quantity:</label> 
     @for (var j = 0; j < ListSize.Length; j++) 
     { 
     <div class="col-md-2"> 
      @Html.TextBox("[" + i + "][" + j + "].SizeAndQuantities.SizeId", null, new 
      { 
      @class = "form-control", 
      @style = "margin-bottom: 15px", 
      @Value = ListSize[j], 
      @readonly = "readonly" 
      }) 
      @Html.TextBox("[" + i + "][" + j + "].SizeAndQuantities.Quantity", null, new { @class = "form-control" }) 
     </div> 
     } 
    </div> 
    } 

控制器:

// GET: Admin/Product 
public ActionResult Create() 
{ 
    return View(); 
} 
// POST: Admin/Product 
[HttpPost] 
public ActionResult Create(ProductViewModel product, IEnumerable 
<SizeColorQuantityViewModel> 
sizeColorQuantity, IEnumerable 
<SizeAndQuantity> 
sizeAndQuantity) 
{ 
    return View(); 
} 

,我可以得到它通过从视图模型IEnumerable<SizeColorQuantityViewModel> sizeColorQuantity到控制器值。但是用这个型号IEnumerable<SizeAndQuantity> sizeAndQuantity,我无法获得任何价值。 因为这是二维数组,所以我不知道这个问题。您能否教我如何将值绑定为IEnumerable<SizeAndQuantity> sizeAndQuantity.

+1

与名称属性您生成输入不涉及到你的模型,但不是很多这段代码正在感。为什么你的视图中有'ListColor'和'ListSize'集合?您是否在尝试编辑红/小,红/中,红/大等产品的数量,并再次针对蓝/小,蓝/中等等进行编辑? –

+0

@StephenMuecke是的,我也想过很多方式来发布大小,颜色和数量的产品。你有没有其他的方法?如果你不介意,你能更多地解释我吗?非常感谢:D –

+1

您需要进行很多更改才能完成此项工作。你可以改变IEnumerable 到'List 吗?(它会让它更容易) –

您生成的输入具有与您的模型无关的名称属性,因此不能受DefaultModelBinder的约束。您需要先在控制器中生成数据(而不是在视图中),以便绑定到模型。

下面假设你SizeColorQuantities属性更改为List<SizeColorQuantityViewModel>

public ActionResult Create() 
{ 
    var colors = new List<string>(){ "Red", "Blue" }; 
    var sizes = new List<string>(){ "S", "M", "L", "XL" }; 

    var model = new ProductViewModel() 
    { 
     Product = "My product", 
     SizeColorQuantities = new List<SizeColorQuantityViewModel> 
    }; 
    foreach(var color in colors) 
    { 
     var child = new SizeColorQuantityViewModel() 
     { 
      ColorId = color, 
      SizeAndQuantities = new List<SizeAndQuantity> 
     }; 
     model.SizeColorQuantities.Add(child); 
     foreach(var size in sizes) 
     { 
      child.SizeAndQuantities.Add(new SizeAndQuantity() 
      { 
       SizeId = size // assumes SizeId is changed to string, not int 
      }); 
     } 
    } 
    return View(model); 
} 

你现在有将被传递给视图一个正确填充视图模型,它可以绑定到内部嵌套for与强类型HtmlHelpers环路

@model ProductViewModel 
.... 
@using (Html.BeginForm()) 
{ 
    .... 
    @for(int i = 0; i < Model.SizeColorQuantities.Count; i++) 
    { 
     @Html.TextBoxFor(m => m.SizeColorQuantities[i].ColorId, new { @class = "form-control", @readonly = "readonly" }) 
     for (int j = 0; j < Model.SizeColorQuantities[i].SizeAndQuantities .Count; j++) 
     { 
      @Html.TextBoxFor(m => m.SizeColorQuantities[i].SizeAndQuantities[j].SizeId, new { @class = "form-control", @readonly = "readonly" }) 
      @Html.TextBoxFor(m => m.SizeColorQuantities[i].SizeAndQuantities[j].Quantity, new { @class = "form-control" }) 
     } 
    } 
    <input type="submit" ... /> 
} 

注:始终使用ST rongly键入***For()HtmlHelper方法和从不尝试使用HtmlHelper方法时设置value(或name)属性。

你的POST方法现在需要

[HttpPost] 
public ActionResult Create(ProductViewModel model) 
{ 
    .... 
} 

注意,您还可以使用自定义EditorTemplate的为你的类型为HTML Table to ADO.NET DataTable,这也解释了如何您name属性必须以结合生成解释集合。在你的情况,例如您的Quantity输入必须(比较,为你的当前生成)

<input name="SizeColorQuantities[0].SizeAndQuantities[0].Quantity" ... /> 
<input name="SizeColorQuantities[0].SizeAndQuantities[1].Quantity" ... /> 
.... 
<input name="SizeColorQuantities[1].SizeAndQuantities[0].Quantity" ... /> 
<input name="SizeColorQuantities[1].SizeAndQuantities[1].Quantity" ... /> 
.... 
+0

你救了我的命。我从这个例子中学到了很多东西。非常感谢(弓) –

+0

我可以再问你一个问题吗?我释放从HttpPost返回的模型为null。你有什么想法吗? (ProductViewModel model) var test = product.Product; return View(); } –

+0

对不起@Stephen Muecke。我发现如何解决这个问题。原因我设置参数变量是“产品”,它是与属性名称相同的名称。 非常感谢你。 http://stackoverflow.com/a/35889181/4642316 –