Add functional test covering an `IList<T>` property

- #5656
This commit is contained in:
Doug Bunting 2017-03-28 18:35:19 -07:00
parent bd6520cc50
commit 1672820e4e
8 changed files with 191 additions and 1 deletions

View File

@ -20,6 +20,38 @@
<option value="HtmlEncode[[2]]">HtmlEncode[[Product_2]]</option>
</select>
</div>
<div>
<table>
<tr>
<th>
<label for="HtmlEncode[[Number]]">HtmlEncode[[Number]]</label>
</th>
<th>
<label for="HtmlEncode[[ProductName]]">HtmlEncode[[ProductName]]</label>
</th>
</tr>
<tr>
<td>
<input type="HtmlEncode[[number]]" data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The Number field is required.]]" id="HtmlEncode[[ProductDetails_0__Number]]" name="HtmlEncode[[ProductDetails[0].Number]]" value="HtmlEncode[[0]]" />
<span class="text-danger HtmlEncode[[field-validation-valid]]" style="" data-valmsg-for="HtmlEncode[[ProductDetails[0].Number]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
</td>
<td>
<input type="HtmlEncode[[text]]" data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The ProductName field is required.]]" id="HtmlEncode[[ProductDetails_0__ProductName]]" name="HtmlEncode[[ProductDetails[0].ProductName]]" value="HtmlEncode[[Product_0]]" />
<span class="text-danger HtmlEncode[[field-validation-valid]]" style="" data-valmsg-for="HtmlEncode[[ProductDetails[0].ProductName]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
</td>
</tr>
<tr>
<td>
<input type="HtmlEncode[[number]]" data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The Number field is required.]]" id="HtmlEncode[[ProductDetails_1__Number]]" name="HtmlEncode[[ProductDetails[1].Number]]" value="HtmlEncode[[1]]" />
<span class="text-danger HtmlEncode[[field-validation-valid]]" style="" data-valmsg-for="HtmlEncode[[ProductDetails[1].Number]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
</td>
<td>
<input type="HtmlEncode[[text]]" data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The ProductName field is required.]]" id="HtmlEncode[[ProductDetails_1__ProductName]]" name="HtmlEncode[[ProductDetails[1].ProductName]]" value="HtmlEncode[[Product_1]]" />
<span class="text-danger HtmlEncode[[field-validation-valid]]" style="" data-valmsg-for="HtmlEncode[[ProductDetails[1].ProductName]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
</td>
</tr>
</table>
</div>
<div>
<label class="order" for="HtmlEncode[[SubstituteProducts]]">HtmlEncode[[SubstituteProducts]]</label>
<select id="HtmlEncode[[SubstituteProducts]]" multiple="HtmlEncode[[multiple]]" name="HtmlEncode[[SubstituteProducts]]"><option value="HtmlEncode[[0]]">HtmlEncode[[Product_0]]</option>

View File

@ -20,6 +20,38 @@
<option value="2">Product_2</option>
</select>
</div>
<div>
<table>
<tr>
<th>
<label for="Number">Number</label>
</th>
<th>
<label for="ProductName">ProductName</label>
</th>
</tr>
<tr>
<td>
<input type="number" data-val="true" data-val-required="The Number field is required." id="ProductDetails_0__Number" name="ProductDetails[0].Number" value="0" />
<span class="text-danger field-validation-valid" style="" data-valmsg-for="ProductDetails[0].Number" data-valmsg-replace="true"></span>
</td>
<td>
<input type="text" data-val="true" data-val-required="The ProductName field is required." id="ProductDetails_0__ProductName" name="ProductDetails[0].ProductName" value="Product_0" />
<span class="text-danger field-validation-valid" style="" data-valmsg-for="ProductDetails[0].ProductName" data-valmsg-replace="true"></span>
</td>
</tr>
<tr>
<td>
<input type="number" data-val="true" data-val-required="The Number field is required." id="ProductDetails_1__Number" name="ProductDetails[1].Number" value="1" />
<span class="text-danger field-validation-valid" style="" data-valmsg-for="ProductDetails[1].Number" data-valmsg-replace="true"></span>
</td>
<td>
<input type="text" data-val="true" data-val-required="The ProductName field is required." id="ProductDetails_1__ProductName" name="ProductDetails[1].ProductName" value="Product_1" />
<span class="text-danger field-validation-valid" style="" data-valmsg-for="ProductDetails[1].ProductName" data-valmsg-replace="true"></span>
</td>
</tr>
</table>
</div>
<div>
<label class="order" for="SubstituteProducts">SubstituteProducts</label>
<select id="SubstituteProducts" multiple="multiple" name="SubstituteProducts"><option value="0">Product_0</option>

View File

@ -20,6 +20,38 @@
<option value="HtmlEncode[[2]]">HtmlEncode[[Product_2]]</option>
</select>
</div>
<div>
<table>
<tr>
<th>
<label for="HtmlEncode[[Number]]">HtmlEncode[[Number]]</label>
</th>
<th>
<label for="HtmlEncode[[ProductName]]">HtmlEncode[[ProductName]]</label>
</th>
</tr>
<tr>
<td>
<input data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The Number field is required.]]" id="HtmlEncode[[ProductDetails_0__Number]]" name="HtmlEncode[[ProductDetails[0].Number]]" type="HtmlEncode[[number]]" value="HtmlEncode[[0]]" />
<span class="HtmlEncode[[field-validation-valid text-danger]]" data-valmsg-for="HtmlEncode[[ProductDetails[0].Number]]" data-valmsg-replace="HtmlEncode[[true]]" style=""></span>
</td>
<td>
<input data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The ProductName field is required.]]" id="HtmlEncode[[ProductDetails_0__ProductName]]" name="HtmlEncode[[ProductDetails[0].ProductName]]" type="HtmlEncode[[text]]" value="HtmlEncode[[Product_0]]" />
<span class="HtmlEncode[[field-validation-valid text-danger]]" data-valmsg-for="HtmlEncode[[ProductDetails[0].ProductName]]" data-valmsg-replace="HtmlEncode[[true]]" style=""></span>
</td>
</tr>
<tr>
<td>
<input data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The Number field is required.]]" id="HtmlEncode[[ProductDetails_1__Number]]" name="HtmlEncode[[ProductDetails[1].Number]]" type="HtmlEncode[[number]]" value="HtmlEncode[[1]]" />
<span class="HtmlEncode[[field-validation-valid text-danger]]" data-valmsg-for="HtmlEncode[[ProductDetails[1].Number]]" data-valmsg-replace="HtmlEncode[[true]]" style=""></span>
</td>
<td>
<input data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The ProductName field is required.]]" id="HtmlEncode[[ProductDetails_1__ProductName]]" name="HtmlEncode[[ProductDetails[1].ProductName]]" type="HtmlEncode[[text]]" value="HtmlEncode[[Product_1]]" />
<span class="HtmlEncode[[field-validation-valid text-danger]]" data-valmsg-for="HtmlEncode[[ProductDetails[1].ProductName]]" data-valmsg-replace="HtmlEncode[[true]]" style=""></span>
</td>
</tr>
</table>
</div>
<div>
<label class="HtmlEncode[[order]]" for="HtmlEncode[[SubstituteProducts]]">HtmlEncode[[SubstituteProducts]]</label>
<select id="HtmlEncode[[SubstituteProducts]]" multiple="HtmlEncode[[multiple]]" name="HtmlEncode[[SubstituteProducts]]"><option value="HtmlEncode[[0]]">HtmlEncode[[Product_0]]</option>

View File

@ -20,6 +20,38 @@
<option value="2">Product_2</option>
</select>
</div>
<div>
<table>
<tr>
<th>
<label for="Number">Number</label>
</th>
<th>
<label for="ProductName">ProductName</label>
</th>
</tr>
<tr>
<td>
<input data-val="true" data-val-required="The Number field is required." id="ProductDetails_0__Number" name="ProductDetails[0].Number" type="number" value="0" />
<span class="field-validation-valid text-danger" data-valmsg-for="ProductDetails[0].Number" data-valmsg-replace="true" style=""></span>
</td>
<td>
<input data-val="true" data-val-required="The ProductName field is required." id="ProductDetails_0__ProductName" name="ProductDetails[0].ProductName" type="text" value="Product_0" />
<span class="field-validation-valid text-danger" data-valmsg-for="ProductDetails[0].ProductName" data-valmsg-replace="true" style=""></span>
</td>
</tr>
<tr>
<td>
<input data-val="true" data-val-required="The Number field is required." id="ProductDetails_1__Number" name="ProductDetails[1].Number" type="number" value="1" />
<span class="field-validation-valid text-danger" data-valmsg-for="ProductDetails[1].Number" data-valmsg-replace="true" style=""></span>
</td>
<td>
<input data-val="true" data-val-required="The ProductName field is required." id="ProductDetails_1__ProductName" name="ProductDetails[1].ProductName" type="text" value="Product_1" />
<span class="field-validation-valid text-danger" data-valmsg-for="ProductDetails[1].ProductName" data-valmsg-replace="true" style=""></span>
</td>
</tr>
</table>
</div>
<div>
<label class="order" for="SubstituteProducts">SubstituteProducts</label>
<select id="SubstituteProducts" multiple="multiple" name="SubstituteProducts"><option value="0">Product_0</option>

View File

@ -52,6 +52,10 @@ namespace HtmlGenerationWebSite.Controllers
{
_productsList = new SelectList(_products, "Number", "ProductName");
_productsListWithSelection = new SelectList(_products, "Number", "ProductName", 2);
foreach (var i in _order.Products)
{
_order.ProductDetails.Add(_products[i]);
}
}
public IActionResult Enum()

View File

@ -55,5 +55,7 @@ namespace HtmlGenerationWebSite.Models
get;
set;
}
public IList<Product> ProductDetails { get; } = new List<Product>();
}
}

View File

@ -1,4 +1,4 @@
@model HtmlGenerationWebSite.Models.Order
@model HtmlGenerationWebSite.Models.Order
@{
ViewBag.Title = "Order Page";
@ -33,6 +33,34 @@
@{ var @object = "multiple"; }
<select asp-for="@Model.Products" asp-items="@((IEnumerable<SelectListItem>)ViewBag.Items)" multiple="@(@object)"></select>
</div>
<div>
@if (Model.ProductDetails.Count > 0)
{
<table>
<tr>
<th>
<label asp-for="ProductDetails.FirstOrDefault().Number"></label>
</th>
<th>
<label asp-for="ProductDetails.FirstOrDefault().ProductName"></label>
</th>
</tr>
@for (var i = 0; i < Model.ProductDetails.Count; i++)
{
<tr>
<td>
<input asp-for="ProductDetails[i].Number" />
<span asp-validation-for="ProductDetails[i].Number" class="text-danger" style=""></span>
</td>
<td>
<input asp-for="ProductDetails[i].ProductName" />
<span asp-validation-for="ProductDetails[i].ProductName" class="text-danger" style=""></span>
</td>
</tr>
}
</table>
}
</div>
<div>
<label asp-for="SubstituteProducts" class="order"></label>
@* Use same select list as Products. Selection when Products is non-null is not used here. *@

View File

@ -27,6 +27,34 @@
@{ var productSelectList = (IEnumerable<SelectListItem>)ViewBag.Items; }
@Html.ListBoxFor(m => m.Products, productSelectList)
</div>
<div>
@if (Model.ProductDetails.Count > 0)
{
<table>
<tr>
<th>
@Html.LabelFor(m => m.ProductDetails.FirstOrDefault().Number)
</th>
<th>
@Html.LabelFor(m => m.ProductDetails.FirstOrDefault().ProductName)
</th>
</tr>
@for (var i = 0; i < Model.ProductDetails.Count; i++)
{
<tr>
<td>
@Html.TextBoxFor(m => m.ProductDetails[i].Number, htmlAttributes: new { type = "number" })
@Html.ValidationMessageFor(m => m.ProductDetails[i].Number, message: null, htmlAttributes: new { @class = "text-danger", style = "" })
</td>
<td>
@Html.TextBoxFor(m => m.ProductDetails[i].ProductName)
@Html.ValidationMessageFor(m => m.ProductDetails[i].ProductName, message: null, htmlAttributes: new { @class = "text-danger", style = "" })
</td>
</tr>
}
</table>
}
</div>
<div>
@Html.LabelFor(m => m.SubstituteProducts, htmlAttributes: new { @class = "order" })
@* Use same select list as Products. Selection when Products is non-null is not used here. *@