Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用基类并具有从基类继承的类_C#_Asp.net Mvc_Razor_Asp.net Core 2.2_Base Class - Fatal编程技术网

C# 使用基类并具有从基类继承的类

C# 使用基类并具有从基类继承的类,c#,asp.net-mvc,razor,asp.net-core-2.2,base-class,C#,Asp.net Mvc,Razor,Asp.net Core 2.2,Base Class,我有一个基本类: public class BaseClass { public string Name { get; set; } public string LastName { get; set; } } 从基类继承的类: public class InheriteClass : BaseClass { public string MyProperty { get; set; } } 因此,在第一个视图中,您需要填写“姓名”和“姓氏”,然后单击“下一步”,转到另

我有一个基本类:

public class BaseClass
{
    public string Name { get; set; }
    public string LastName { get; set; }
}
从基类继承的类:

public class InheriteClass : BaseClass
{
    public string MyProperty { get; set; }
}
因此,在第一个视图中,您需要填写“姓名”和“姓氏”,然后单击“下一步”,转到另一个包含更多字段的视图

但是当我在这个视图中点击“提交”按钮时,属性“Name”和LastName“为空

第一页“下一步”按钮:

下一个视图包括:

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

更新
具有更清晰的示例。在上面的示例中为“Name”和“LastName”“为空。

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

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


总之,您不能在操作中绑定到基类。任何不在基类上的内容都将被丢弃。如果需要
InheritanceClass
,则必须绑定到
InheritanceClass

不要忘记InheritanceClass的base()关键字!你在哪里提交数据?您是否将控制器操作包括到您要提交的位置?谢谢。我看不出这是如何编译的,因为您正在访问根本不存在的
baseClass.MyProperty
。你确定你的例子是准确的吗?@JohnWu更新了我的例子,我看到了,所以在我的例子中,最好只创建一个类,在两个视图上使用相同的类?是的。基本上。还可以创建包含各种子类型的所有特性的单独视图模型,然后根据数据(哪些特性具有值等)映射到相应的子类型。主要的一点是,您绑定到的类需要具有来自post的任何和所有数据的属性。它可以有更多属性,但不能更少,否则数据将被丢弃。嗯,我切换到一个类并将其传递到下一个视图,但它也会丢失“Name”和“LastName”的值。
@model InheritanceClass
    public IActionResult SubmitThis(InheritanceClass inheritanceClass )
    {
        var testClass = new testClass
        {
            Name = inheritanceClass.Name,
            LastName = inheritanceClass.LastName,
            MyProperty = inheritanceClass.MyProperty
        };

        return View(testClass);
    }