Is there a simple way to create this html structure using a model and Html Helper ASP.NET Core MVC. .NET 8.0. Never used tag helper.
Please refer to the following sample which properly indexes the name attribute of input element:
Model
The Country class below assumes the tblData class in your question.
namespace MvcNet8App.Models
{
public class Country
{
public string? Name { get; set; }
public string? Capital { get; set; }
public string? Continent { get; set; }
}
}
Controller
using Microsoft.AspNetCore.Mvc;
using MvcNet8App.Models;
namespace MvcNet8App.Controllers
{
public class CollectionController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Edit(int id)
{
var countries = new List<Country>
{
new Country { Name = "Italy", Capital = "Rome", Continent = "Europe" },
new Country { Name = "Spain", Capital = "Madrid", Continent = "Europe"},
new Country { Name = "USA", Capital = "Washington", Continent = "NorthAmerica"}
};
return View(countries);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(List<Country> countries)
{
if (ModelState.IsValid)
{
return RedirectToAction(nameof(Index));
}
return View(countries);
}
}
}
View
@model IList<MvcNet8App.Models.Country>
@{
ViewData["Title"] = "Edit";
}
<h1>Edit</h1>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Edit">
@for (int i = 0; i < Model.Count; i++)
{
<div class="form-group">
@Html.LabelFor(m => m[i].Name)
@Html.EditorFor(m => m[i].Name)
</div>
<div class="form-group">
@Html.LabelFor(m => m[i].Capital)
@Html.EditorFor(m => m[i].Capital)
</div>
<div class="form-group">
@Html.LabelFor(m => m[i].Continent)
@Html.EditorFor(m => m[i].Continent)
</div>
<hr />
}
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
</div>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
}
html code rendered by View
<div class="row">
<div class="col-md-4">
<form action="/Collection/Edit" method="post">
<div class="form-group">
<label for="z0__Name">Name</label>
<input class="text-box single-line" id="z0__Name" name="[0].Name" type="text" value="Italy" />
</div>
<div class="form-group">
<label for="z0__Capital">Capital</label>
<input class="text-box single-line" id="z0__Capital" name="[0].Capital" type="text" value="Rome" />
</div>
<div class="form-group">
<label for="z0__Continent">Continent</label>
<input class="text-box single-line" id="z0__Continent" name="[0].Continent" type="text" value="Europe" />
</div>
<hr />
<div class="form-group">
<label for="z1__Name">Name</label>
<input class="text-box single-line" id="z1__Name" name="[1].Name" type="text" value="Spain" />
</div>
<div class="form-group">
<label for="z1__Capital">Capital</label>
<input class="text-box single-line" id="z1__Capital" name="[1].Capital" type="text" value="Madrid" />
</div>
<div class="form-group">
<label for="z1__Continent">Continent</label>
<input class="text-box single-line" id="z1__Continent" name="[1].Continent" type="text" value="Europe" />
</div>
<hr />
<div class="form-group">
<label for="z2__Name">Name</label>
<input class="text-box single-line" id="z2__Name" name="[2].Name" type="text" value="USA" />
</div>
<div class="form-group">
<label for="z2__Capital">Capital</label>
<input class="text-box single-line" id="z2__Capital" name="[2].Capital" type="text" value="Washington" />
</div>
<div class="form-group">
<label for="z2__Continent">Continent</label>
<input class="text-box single-line" id="z2__Continent" name="[2].Continent" type="text" value="NorthAmerica" />
</div>
<hr />
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8K9TttPMA5pPkueYr6bUiHuFZY7NJSip5auaseK5C-chks5XsqlUDKTeG_i-enQsk3Pz-Vi0VAPZbUJxjJWWVbT-txov3DYj-8hiIFsmltlvKIDeHkOtp-ydZXXG0kthArcget-GlW1jj6AfONiN9Qw" /></form>
</div>
</div>
Result of model binding