【问题标题】:Working with a base class and have classes that inherite from it使用基类并拥有从它继承的类
【发布时间】:2020-03-08 10:18:12
【问题描述】:

我有一个基类:

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

继承自 BaseClass 的类:

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

所以第一个视图你需要填写你的“姓名”和“姓氏”,然后点击下一步,你会进入另一个视图,其中包含更多字段。

但是当我在此视图中单击“提交”按钮时,属性“名称”和“姓氏”为空...

首页“下一页”按钮:

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

下一个视图有:

@model InheritanceClass

当我点击“提交”按钮时:

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

        return View(testClass);
    }

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

【问题讨论】:

  • 不要忘记您的 InheritanceClass 的 base() 关键字! docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
  • 您在哪里提交数据?您会将控制器操作包含在您提交的位置吗?谢谢。
  • 我看不出这是如何编译的,因为您正在访问不存在的baseClass.MyProperty。你确定你的例子是准确的吗?
  • @JohnWu 更新了我的示例

标签: c# asp.net-mvc razor asp.net-core-2.2 base-class


【解决方案1】:

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

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

总之,你不能在动作中绑定到基类。任何不在基类上的东西都将被丢弃。如果你需要InheritanceClass,那么你必须绑定到InheritanceClass

【讨论】:

  • 我明白了,所以在我的情况下,最好只创建一个类并在两个视图上使用相同的类?
  • 是的。本质上。您还可以创建一个包含各种子类型的所有属性的单独视图模型,然后根据数据(哪些属性具有值等)映射到适当的子类型。要点是您绑定到的类需要具有来自帖子的任何和所有数据的属性。它可以有更多属性,但不能更少,否则数据将被丢弃。
  • 嗯,我切换到一个类并将其传递给下一个视图,但它也丢失了“名称”和“姓氏”的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2018-05-23
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多