subclass
subclass tag helper makes further fields are rendered and properly processed by the model binder
when a property contains a subclass of its type.
<h3>Generic Person</h3> <div class="form-group"> <label asp-for="Test.Name" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="Test.Name" class="form-control" /> <span asp-validation-for="Test.Name" class="text-danger"></span> </div> </div> <div class="form-group"> <label asp-for="Test.Surname" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="Test.Surname" class="form-control" /> <span asp-validation-for="Test.Surname" class="text-danger"></span> </div> </div> <subclass asp-for="Test" subclass-type="@typeof(Customer)"> @{ { var customer = Model.Test as Customer; <div class="form-group"> <label asp-for="@customer.RegisterNumber" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="@customer.RegisterNumber" class="form-control" /> <span asp-validation-for="@customer.RegisterNumber" class="text-danger"></span> </div> </div> } } </subclass> <subclass asp-for="Test" subclass-type="@typeof(Employee)"> @{ { var employee = Model.Test as Employee; <div class="form-group"> <label asp-for="@employee.Matr" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="@employee.Matr" class="form-control" /> <span asp-validation-for="@employee.Matr" class="text-danger"></span> </div> </div> } } </subclass> ... ... ...
public class SubClassViewModel { public Person Test { get; set; } public Person Test1 { get; set; } public Person Test2 { get; set; } } [RunTimeType] public class Customer : Person { public string RegisterNumber { get; set; } } [RunTimeType] public class Employee : Person { public string Matr { get; set; } }
public IActionResult SubClass() { return View(new SubClassViewModel() { Test = new Person { Name = "Francesco", Surname = "Abbruzzese", }, Test1 = new Customer { Name = "John", Surname = "Smith", RegisterNumber = "12345678" }, Test2 = new Employee { Name = "Peter", Surname = "Black", Matr = "pg34" } }); } [HttpPost] public IActionResult SubClass(SubClassViewModel model) { if (ModelState.IsValid) { } return View(model); }