形式如下: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; }
}
Run Code Online (Sandbox Code Playgroud)
视图:
@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>
}
Run Code Online (Sandbox Code Playgroud)
控制器:
// 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();
}
Run Code Online (Sandbox Code Playgroud)
我可以获得从ViewModel传递IEnumerable<SizeColorQuantityViewModel> sizeColorQuantity
给Controller的值.但是对于这个模型IEnumerable<SizeAndQuantity> sizeAndQuantity
,我无法获得任何价值.因为这是2-D阵列所以,我不知道这个问题.你能教我如何约束价值吗?IEnumerable<SizeAndQuantity> sizeAndQuantity.
小智 8
您的生成输入具有与您的模型没有关系的名称属性,因此不受约束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);
}
Run Code Online (Sandbox Code Playgroud)
您现在拥有一个正确填充的视图模型,该模型将传递给您可以使用强类型HtmlHelpers
嵌套for
循环绑定到的视图
@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" ... />
}
Run Code Online (Sandbox Code Playgroud)
注意:始终使用强类型***For()
HtmlHelper
方法,并且在使用方法时永远不要尝试设置value
(或name
)属性HtmlHelper
.
你的POST方法现在需要
[HttpPost]
public ActionResult Create(ProductViewModel model)
{
....
}
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以使用自定义EditorTemplate
的类型,如HTML表格中对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" ... />
....
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11607 次 |
最近记录: |