【问题标题】:asp.net mvc automapper usingasp.net mvc 自动映射器使用
【发布时间】:2011-12-14 14:34:30
【问题描述】:

最近我开始使用带有自动映射器的视图模型。 问题立即出现。例如,我有这样的课程:

public class Zone
{
    public int ZoneId;

    public string Title;

    public int BannersCount;
}

public class ZoneView
{
    public int ZoneId
    {
        get;
        set;
    }

    public string Title;
    {
        get;
        set;
    }

    [Required(ErrorMessage = "Поле Кол-во баннеров является обязательным.")]
    [Display(Name = "Кол-во баннеров*")]
    public int BannersCount
    {
        get;
        set;
    }
}

我不想在我的视图中编辑标题。所以我不在 TextEditor 中显示标题,而是这样:

@Model.Title

然后在我的 POST 操作中 ZoneView 带有空标题:

public ActionResult Edit(ZoneView zoneView)

在此之后我将其映射到域模型:

var zone = zonesRepository.Get(zoneView.ZoneId);
Mapper.Map<ZoneView, Zone>(zoneView, zone);

在此之后,区域中的标题为空。在这种情况下,最好的处理方式是什么?

【问题讨论】:

  • 你为什么发布一个空标题?
  • @SLaks,因为我不希望用户编辑标题 - 只是为了显示它。所以它不会放在 TextEditor 中。

标签: asp.net-mvc viewmodel automapper


【解决方案1】:

您可以创建映射定义,指示自动映射器在将值推送到区域时忽略 Title 属性。

Mapper.CreateMap<ZoneView, Zone>()
   .ForMember(destination => destination.Title, member => member.Ignore());

您将在应用程序启动时定义此 CreateMap 一次。然后像以前一样映射。

var zone = zonesRepository.Get(zoneView.ZoneId);
Mapper.Map<ZoneView, Zone>(zoneView, zone);

【讨论】:

  • +1 我不知道 automapper,但这听起来比我的更好。欢呼
  • 是的,我创建了这个映射但没有说明。谢谢,我试试(=
  • 他是否也可以考虑从 ZoneView.Title 中删除设置器,以便仅通过 ZoneView 构造函数接受它?这样,默认模型绑定器将无法设置属性,但他仍然可以显示它,并且该逻辑成为视图的一部分。当然,该视图不能用于其他允许编辑标题的地方,例如在管理面板中。只是好奇你的想法?
  • 他当然可以,但我认为这只是不必要地跳过了太多圈。在实践中,视图模型应该非常简单直接,只关心指定您想要显示或收集的信息,其中域模型的所有复杂方面都被扁平化或以其他方式简化。
  • 正如我提到的,我的想法是他可以通过构造函数来处理它,但足够公平。就您的观点而言,我多年来一直在使用视图模型的概念,并且从未将逻辑业务逻辑放入其中,只是对使用 automapper 感到好奇和不熟悉。谢谢
【解决方案2】:
  • 大多数时候我使用隐藏输入这样的值。
  • 并且还在数据库级别检查标题值的验证。

这可能不是最好的解决方案,但它确实有效。

【讨论】:

  • 隐藏输入可由用户更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2015-12-13
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多