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.

Generic Person

... ... ...

Customer subclass

Employee subclass

<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 { getset; }
    public Person Test1 { getset; }
    public Person Test2 { getset; }
}
 
[RunTimeType]
public class Customer : Person
{
    public string RegisterNumber { getset; }
 
}
[RunTimeType]
public class Employee : Person
{
    public string Matr { getset; }
}
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);
}

Fork me on GitHub