代码之家  ›  专栏  ›  技术社区  ›  HamedH

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

  •  2
  • HamedH  · 技术社区  · 8 年前

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

    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"

    2 回复  |  直到 7 年前
        1
  •  2
  •   HamedH    8 年前

    找到它:

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

    所以这是正确的:

    asp-for="@(Model as Student).Grade"
    
        2
  •  0
  •   Set    8 年前

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

    subclass 标记辅助对象围绕每个子类特定的字段。如果模型为null或传递了该类的特定子类,则呈现该字段。

    link