使用基础 class 并从中继承 classis

Working with a base class and have classes that inherite from it

我有一个基地 class :

public class BaseClass
{
    public string Name { get; set; }
    public string LastName { get; set; }
}

Class 继承自 BaseClass :

public class InheriteClass : BaseClass
{
    public string MyProperty { get; set; }
}

因此您需要在第一个视图中填写 "Name" 和 "LastName",然后单击下一步,您将转到具有更多字段的另一个视图。

但是当我在此视图中单击 "Submit" 按钮时,属性 "Name" 和 LastName" 为空...

首页"Next"按钮:

    public IActionResult GoToCategoryView(BaseClass baseClass)
    {
        return RedirectToAction("NextView", baseClass);
    }

下一个视图有:

@model InheritanceClass

当我点击 "Submit" 按钮时:

    public IActionResult SubmitThis(InheritanceClass inheritanceClass )
    {
        var testClass = new testClass
        {
            Name = inheritanceClass.Name,
            LastName = inheritanceClass.LastName,
            MyProperty = inheritanceClass.MyProperty
        };

        return View(testClass);
    }

更新 样品更清晰。在上面的示例中,"Name" 和 "LastName" 为空。

通过请求调用操作 与仅在 class 上调用方法 不同。在后一种情况下,您已经在内存中有一个 InheritanceClass,您只需将其向上转换为 BaseClass。然后,当然,稍后您可以将其向下转型为 InheritanceClass,因为它就是这样。

对于一个动作,参数是从请求中提供的,它只是非结构化的、未绑定的数据。模型绑定器用于尝试 "bind" 将该数据转换为实际的结构化类型。为了做到这一点,它查看参数的类型并实例化 that 类型(即 BaseClass)。然后,它将请求中的数据映射到 class 实例上的适当属性。但重要的是,BaseClass 没有 MyProperty 属性,因此模型绑定器将 丢弃 该值。你最后得到的只是一个 BaseClass 实例,因为那是参数的类型。如果愿意,您可以向下转换为 InheritanceClass,但是任何特定于 InheritanceClass 的属性都将为 null 或默认值,因为它们在 BaseClass.

上不存在

总而言之,您不能在操作中绑定到基础 classes。任何不在基础 class 上的东西都将被丢弃。如果你需要InheritanceClass,那么你必须绑定到InheritanceClass