ASP 在模型中具有继承性的核心标签助手

ASP Core tag helper with inheritance in model

假设我们有这些简化模型:

public class Person {
   public string Address {set;get;}
}

public class Student: Person {
   public float Grade {set;get;}
}
public class Teacher: Person {
   public string Department {set; get;}
}

现在我们想要为学生和老师创建一个页面。我的问题是我们如何利用继承的好处为学生和老师只创建一个页面?

我试过这个:

@model Person

@{
    bool isStudent = Model is Student;
}

<form asp-action="Create">
    <div class="form-horizontal">
    @if (isStudent)
    {
        <div class="form-group">
            <label asp-for="((Student)Model).Grade" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="((Student)Model).Grade" class="form-control" />
                <span asp-validation-for="((Student)Model).Grade" class="text-danger"></span>
            </div>
        </div>
   } else {
        <div class="form-group">
            <label asp-for="((Teacher)Model).Department" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="((Teacher)Model).Department" class="form-control" />
                <span asp-validation-for="((Teacher)Model).Department" class="text-danger"></span>
            </div>
        </div>
   }
   <div class="form-group">
         <label asp-for="Address" class="col-md-2 control-label"></label>
         <div class="col-md-10">
             <input asp-for="Address" class="form-control" />
             <span asp-validation-for="Address" class="text-danger"></span>
         </div>
   </div>
   <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-success" />
            </div>
        </div>
    </div>
</form>

但不允许asp-for="((Student)Model).Grade"

查看关于 github 的 ViewModel with inheritance in ASP .NET Core 讨论:

它提出了一种解决方案,其中 subclass 标签助手围绕着每个子 class 特定的字段。如果模型为 null 或传递了 class 的特定子 class,则将呈现该字段。

示例如下:link

找到了:

根据https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms#the-input-tag-helper “@”字符可用于开始内联表达式

所以这是正确的:

asp-for="@(Model as Student).Grade"