视图模型绑定:当绑定到的类是抽象的时,是否有一种方法可以访问具体实现的属性?

0

我试图在ASP.NET MVC视图的绑定模型中访问抽象对象的具体实现,但是我不知道如何绑定到该属性的属性,而该属性是其具体实现的一部分。

public abstract class BasePageVO
{
    public string DisplayText { get; set; }
    public BaseFoo FooItem { get; set; }
}

public class ConcretePageVO : BasePageVO
{
    // some properties

    // in a concrete page, the concrete implementation of BaseFoo is known at compile time.
}

public abstract class BaseFoo
{
    public string FooText { get; set; }
}

public class ConcreteFoo : BaseFoo
{
    public string ConcreteProperty { get; set; }
}

更重要的是,为什么我采用了这样一个异常的类结构,是因为共享的部分也需要了解FooItem,但只需要了解其抽象属性。下面是结构的简化轮廓:

DisplayFoo.cshtml:

@model ConcretePageVO

@using (Html.BeginForm("Submit", "Foo", FormMethod.Post)
{
    @Html.Partial("DisplayFooShared", @Model)
    @Html.EditorFor(x => x.FooItem.ConcreteProperty) @* This fails *@
}

DisplayFooShared.cshtml:

@model BasePageVO

<div>
    @Html.DisplayFor(x => x.DisplayText)
    @Html.EditorFor(x => x.FooItem.FooText)
    @* More properties... *@
</div>

有没有一种方法可以向Razor指示BaseFoo对象属于预期的具体类型,并且仍然受益于我如何在共享的局部视图中执行模型绑定?我以为我为BaseFoo创建自己的自定义模型绑定是在正确的轨道上,就像Darin在这里给出的答案一样,但是ASP.NET引发了一个编译错误,Razor不知道如何处理属性名称,因为它不是。定义。

有没有一种方法可以完成对这些特定于实现的属性的绑定,并仍然受益于ASP.NET MVC提供的强大类型?我是否在使用自定义绑定的过程中走了一条正确的路,而仅仅破坏了实现?在此先感谢您的任何建议。

编辑:我替换@Html.EditorFor(x => x.FooItem.ConcreteProperty)@Html.EditorFor(x => (x.FooItem as ConcreteFoo).ConcreteProperty),这将导致绑定成功。不过,还有更好的方法吗?

埃里克·冯肯布施(Erik Funkenbusch)

您所做的违反了面向对象编程的原理。您有一个基类,并且试图将其像派生类一样对待,这只是一个巨大的危险信号。如果需要派生类,则模型中应该有一个派生类。

否则,您唯一的选择就是强制转换,这是一种巨大的代码味道,如果对象实际上不是您认为的实际派生对象,则可能存在缺陷。

您真正的问题很可能是您正在尝试使用某种域模型作为视图模型。您应该自定义视图模型,使其恰好是该视图所需的模型。然后,您应该将域模型映射到视图模型,然后进行必要的任何转换。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从模型到视图的绑定的一种方法

来自分类Dev

有没有一种方法可以将属性绑定到如果未绑定的情况下应具有的值

来自分类Dev

WTForms:我分别绑定对象上的每个字段,是否有一种方法可以一次将对象绑定到表单上?

来自分类Dev

Java中有没有一种方法可以检查具体的类是否以相同的完全限定名称实现外部接口?

来自分类Dev

有没有一种简单的方法可以将所有可用类型绑定到具体实例

来自分类Dev

有没有一种方法可以将按钮的Enabled属性绑定到复选框的Checked属性?

来自分类Dev

有没有一种方法可以将输入绑定到模型并在两者之间设置日期过滤器?

来自分类Dev

将SwiftUI警报或操作表绑定到值类型模型属性的可选性的一种好方法是什么(当属性为nil时显示视图)?

来自分类Dev

有没有一种方法可以将javafx按钮绑定到File属性;如果文件存在或不启用/禁用按钮

来自分类Dev

绑定到类的依赖项属性时,绑定不起作用(仅一种方式)

来自分类Dev

在lua中,有没有一种方法可以将upvalue绑定到userdata值而不是函数?

来自分类Dev

有没有一种方法可以简洁地绑定到Angular 2中的多个事件?

来自分类Dev

有没有一种方法,我可以从绑定的Windows主机到Linux容器安装点的文件?

来自分类Dev

在VueJS中,是否有一种方法可以使您绑定的样式对屏幕的尺寸变化做出反应?

来自分类Dev

当您拥有的所有东西都是可调用的时,是否有一种方法可以访问方法的类

来自分类Dev

从DOM元素绑定到Controller属性的一种方法-Ember

来自分类Dev

有没有一种方法可以使用AngularJS在没有JavaScript的模型上从ng-repeat绑定$ index的2种方式?

来自分类Dev

WTForms:我分别绑定对象上的每个字段,是否有一种方法可以一次将所有对象都绑定到表单上?

来自分类Dev

有没有一种方法可以强制派生类实现抽象类或嵌套在基类中的接口?

来自分类Dev

有没有一种方法可以同时在Tkinter中取消绑定多个绑定键?

来自分类Dev

有没有一种方法可以隐式类覆盖默认实现

来自分类Dev

有没有一种方法可以在JAVAFX上实现“呈现”之类的属性?

来自分类Dev

有没有一种方法可以在Python中实现全局计算属性?

来自分类Dev

iOS:是否有一种方法可以使用条件查询,具体取决于单击了哪个表格视图单元格

来自分类Dev

调用EdmxWriter.WriteEdmx时是否有一种方法可以忽略某些实体属性

来自分类Dev

有没有一种方法可以指定类的默认属性?

来自分类Dev

有没有一种方法可以将几个实例绑定到Guice中的许多不同键?

来自分类Dev

有没有一种方法可以在SwiftUI中特定索引处的枚举中创建计算数组属性的绑定?

来自分类Dev

有没有一种方法可以使OpenCL C ++绑定对所有错误抛出异常?

Related 相关文章

  1. 1

    从模型到视图的绑定的一种方法

  2. 2

    有没有一种方法可以将属性绑定到如果未绑定的情况下应具有的值

  3. 3

    WTForms:我分别绑定对象上的每个字段,是否有一种方法可以一次将对象绑定到表单上?

  4. 4

    Java中有没有一种方法可以检查具体的类是否以相同的完全限定名称实现外部接口?

  5. 5

    有没有一种简单的方法可以将所有可用类型绑定到具体实例

  6. 6

    有没有一种方法可以将按钮的Enabled属性绑定到复选框的Checked属性?

  7. 7

    有没有一种方法可以将输入绑定到模型并在两者之间设置日期过滤器?

  8. 8

    将SwiftUI警报或操作表绑定到值类型模型属性的可选性的一种好方法是什么(当属性为nil时显示视图)?

  9. 9

    有没有一种方法可以将javafx按钮绑定到File属性;如果文件存在或不启用/禁用按钮

  10. 10

    绑定到类的依赖项属性时,绑定不起作用(仅一种方式)

  11. 11

    在lua中,有没有一种方法可以将upvalue绑定到userdata值而不是函数?

  12. 12

    有没有一种方法可以简洁地绑定到Angular 2中的多个事件?

  13. 13

    有没有一种方法,我可以从绑定的Windows主机到Linux容器安装点的文件?

  14. 14

    在VueJS中,是否有一种方法可以使您绑定的样式对屏幕的尺寸变化做出反应?

  15. 15

    当您拥有的所有东西都是可调用的时,是否有一种方法可以访问方法的类

  16. 16

    从DOM元素绑定到Controller属性的一种方法-Ember

  17. 17

    有没有一种方法可以使用AngularJS在没有JavaScript的模型上从ng-repeat绑定$ index的2种方式?

  18. 18

    WTForms:我分别绑定对象上的每个字段,是否有一种方法可以一次将所有对象都绑定到表单上?

  19. 19

    有没有一种方法可以强制派生类实现抽象类或嵌套在基类中的接口?

  20. 20

    有没有一种方法可以同时在Tkinter中取消绑定多个绑定键?

  21. 21

    有没有一种方法可以隐式类覆盖默认实现

  22. 22

    有没有一种方法可以在JAVAFX上实现“呈现”之类的属性?

  23. 23

    有没有一种方法可以在Python中实现全局计算属性?

  24. 24

    iOS:是否有一种方法可以使用条件查询,具体取决于单击了哪个表格视图单元格

  25. 25

    调用EdmxWriter.WriteEdmx时是否有一种方法可以忽略某些实体属性

  26. 26

    有没有一种方法可以指定类的默认属性?

  27. 27

    有没有一种方法可以将几个实例绑定到Guice中的许多不同键?

  28. 28

    有没有一种方法可以在SwiftUI中特定索引处的枚举中创建计算数组属性的绑定?

  29. 29

    有没有一种方法可以使OpenCL C ++绑定对所有错误抛出异常?

热门标签

归档