c# - 使用基类并拥有从其继承的类

标签 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; }
}

继承自BaseClass的类:

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

因此,您需要在第一个 View 中填写“姓名”和“姓氏”,然后单击“下一步”,然后转到包含更多字段的另一个 View 。

但是当我在此 View 中单击“提交”按钮时,属性“Name”和 LastName”为空...

首页“下一步”按钮:

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

下一个 View 有:

@model InheritanceClass

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

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

        return View(testClass);
    }

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

最佳答案

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

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

总而言之,您不能在操作中绑定(bind)到基类。任何不在基类上的东西都将被丢弃。如果您需要 InheritanceClass,则必须绑定(bind)到 InheritanceClass

关于c# - 使用基类并拥有从其继承的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58823193/

相关文章:

c# - 在 Internet 上用很少的客户端保护 WCF 服务的最佳方法

c# - 如何在表达式树中编写 string.Contains(someText)

jquery - 如何选择在mvc中动态选择的css类

asp.net-mvc - 在每个下拉列表项上显示工具提示(或标题)消息

c# - xml序列化和编码

c# - 板载 ReSharper 时的 T4MVC?

jquery - 在 Ajax.BeginForm 中发送 javascript 数组

c# - mvc razor 允许用户选择自己的主题 css

asp.net-mvc-3 - 具有 ASP.NET MVC3 和嵌入式 Razor View 的插件框架

c# - 传入字典的模型项的类型为 'System.Net.Http.HttpResponseMessage' ,