【问题标题】:Immutable structs in ASP.NET MVC modelASP.NET MVC 模型中的不可变结构
【发布时间】:2015-02-26 07:59:26
【问题描述】:

如果我在模型中使用不可变结构,即:

public struct ImmutableStruct
{
    private readonly int firstProperty;

    public ImmutableStruct(int firstProperty) : this()
    {
        this.firstProperty = firstProperty
    }

    public int FirstProperty { get { return firstProperty; } }
}

模型片段:

public class SomeModel
{
    public ImmutableStruct structProperty { get; set; }
}

视图片段:

@model SomeModel

<div>
    @Html.EditorFor(x = x.structProperty.FirstProperty)
</div>

模型绑定器在回发到控制器时似乎无法绑定任何数据。这是否意味着 (1) 不应该使用不可变结构,(2) 需要使用自定义模型绑定器,(3) 或者我需要做其他事情?

【问题讨论】:

  • 你在什么情况下使用这个?您是否尝试绑定到 ImmutableStruct 类型的属性?
  • 是的,我添加了一些代码片段来澄清。
  • 正如 AaronLS 在下面指出的那样,您需要一个无参数的构造函数,并且在任何情况下都需要一个 setter 将 a 绑定到回发时的属性。不太清楚你想用这个实现什么。
  • 我们的项目有一些我们想挂接到 MVC 的遗留结构,它们与此类似(除了它们有多个属性)。不确定最合适的行动方案。

标签: c# asp.net-mvc


【解决方案1】:

据我所知,MVC 需要一个默认的无参数构造函数。您的构造函数不符合条件,因为它需要一个参数。 MVC 通过属性进行绑定,而你的属性没有 setter。

我相信自定义模型绑定器会解决您的问题,允许您调用构造函数。看起来麻烦多于它的价值,特别是因为您可能必须在任何时候向您的类添加属性时修改您的自定义模型绑定器。但我会让你自己决定。

如何将模型绑定到参数化构造函数的详细信息在此模型绑定器中举例说明:

https://stackoverflow.com/a/13535545/84206

注意return new Company(customProfile); 将类似于new ImmutableStruct(someValue)

【讨论】:

  • 可以使用反射创建更通用的自定义模型绑定器,前提是每个模型都有一个构造函数,其参数对应于类中的每个属性。我不会说这比 MVC 假设每个模型都是可变的并且具有默认构造函数的默认行为更糟糕的假设。
  • @MattArnold 是的。我使用 AutoMapper 有一段时间了,这是我想象的可能,很高兴有人做到了,但几年后我得出结论,使用显式映射和使用接口来避免大量重复/全部更容易-组合映射。当反射/动态映射的“魔力”不起作用时,通常很难找到问题所在。只需有一个有形的ToModel&lt;ISomeReturnModel&gt;(ISomeFromEntity fromEntity) 并逐步遍历所有子对象映射,直到遇到未映射的属性/项目,这要容易得多。
  • 我的想法是,MVC 的默认模型绑定器也必须使用某种形式的反射来执行回发数据到属性的映射。仍然存在一个附加问题,即赋值构造函数的参数具有自定义模型绑定器使用的命名约定(例如,每个参数名称都是它映射到的帕斯卡大小写属性名称的驼峰式变体),如果他们决定这样做,可能会抓住某人使用不同的约定。我确实想知道每个模型的 T4 模板生成模型绑定器是否可能是一个更好的解决方案,因为这将具有编译时类型安全性。
猜你喜欢
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
相关资源
最近更新 更多