【问题标题】:Should I define UI default values in my service`DTO or clientside ViewModel我应该在我的服务`DTO 还是客户端 ViewModel 中定义 UI 默认值
【发布时间】:2013-10-04 15:09:46
【问题描述】:

我对这两个操作都有一个创建/编辑对话框。

当我在编辑模式下打开对话框并进行更改时,UI 中的选择将保存到数据库中。

当我在创建模式下打开对话框时,我不必加载 UI 状态,因为我的 UI 中只有默认值。

1.) 现在我问自己是应该通过我的 DTO 从域服务中获取 UI 的默认值,还是应该在我的 ViewModels 中为 UI 定义这些默认值?

2.) 每种方法的优势是什么?

更新

 public SchoolyearCreateRequest CreateSchoolyear()
        {
            var request = new SchoolyearCreateRequest();
            request.MaxPeriodsPerWeek = TimeTable.GetMaxPeriodsPerWeek();
            request.RotationsPerWeek = TimeTable.GetRotationsPerWeek();
            request.FirstDaysOfAWeek = TimeTable.GetFirstDaysOfAWeek();
            request.FirstDayOfWeek = TimeTable.GetFirstDaysOfAWeek().First();
            request.RotationPerWeek = TimeTable.GetRotationsPerWeek().First();
            request.MaxPeriodPerWeek = TimeTable.GetMaxPeriodsPerWeek().First();
            request.ValidStartDate = DateTime.Today;
            request.ValidEndDate = (Nullable<DateTime>)null;
            return request;
        }

3 个默认值 (.First()) 取自 3 个 TimeTable.Get 方法,这不是发送到客户端的冗余数据。

您仍然会以这种方式定义它而不是在客户端视图模型中定义它吗?

更新

namespace TLP.MODEL.DTO
{
    public class SchoolyearCreateRequest
    {
        public IEnumerable<DayOfWeek> FirstDaysOfAWeek { get; set; }
        public IEnumerable<int> MaxPeriodsPerWeek { get; set; }
        public IEnumerable<int> RotationsPerWeek { get; set; }
        public DateTime ValidStartDate { get; set; }
        public DateTime? ValidEndDate { get; set; }
        public DayOfWeek FirstDayOfWeek { get; set; }
        public int MaxPeriodPerWeek { get; set; }
        public int RotationPerWeek { get; set; }
    }
}

【问题讨论】:

  • 你能发布 SchoolyearCreateRequest 类吗,只是为了让我看看类型以帮助我更好地理解。
  • @Marc 是的 8 小时后我在家 b4 我的笔记本电脑 :)
  • @Marc Done 更新...

标签: asp.net-mvc mvvm viewmodel single-page-application


【解决方案1】:

这不是真正的优势/劣势问题,而是关注点的清晰分离。在我看来,默认值属于域方面,既不在视图中,也不在 ViewModel 中。可以这样想:如果您愿意,假设您的域服务并使用非 MVVM 技术(非 MVVM)构建一个全新的 UI,您的默认值仍将保持不变。这是一个很好的指标,据我所知,它们不属于 UI 方面。

由于默认值也不是“真正的逻辑”,您可以考虑将它们隔离在一个配置文件中,这样就可以在不重新编译软件的情况下更改它们。

更新:

好的,明白了:所以你在做什么,基本上:你有一个可行值的列表,你想在你的 UI 中设置一个实际值(即:MaxPeriodsPerWeek == {4, 5, 7, 3, 2})。您的默认值是列表中的第一项 (4)。我同意,没有理由在域端设置此默认值,因为它很容易只是列表中的第一项。

在我看来,好像你在这里的一个类中有两个概念,这使得你很难理解你的请求类的实际目的是什么。显然,有一组可行值MaxPeriodsPerWeek,然后有一个值表示实际设置的值,'MaxPeriodPerWeek'。我理解正确吗?

在不知道你想做什么的情况下,我认为这两者应该分开。如果我理解您的情况,这就是我所期望的:

public class SchoolyearCreateRequest
{
    public DateTime ValidStartDate { get; set; }
    public DateTime? ValidEndDate { get; set; }
    public DayOfWeek FirstDayOfWeek { get; set; }
    public int MaxPeriodPerWeek { get; set; }
    public int RotationPerWeek { get; set; }
}

完全清楚这个类及其属性的含义。您的属性名称真的很混乱:RotationPerWeekRotationsPerWeek??出于英语语法原因,RotationPerWeek 需要等于 1 ;)

然后在数据层中定义一些方法来为您的属性获取可行的值,如果这是真的需要的话(我怀疑 DaysOfWeek 和整数)。将您的 ComboBox 的 ItemsSource 或您拥有的任何值绑定到可行值,将 SelectedValue 绑定到您的实际值,并将其初始 SelectedIndex 设置为 1 以获得初始默认选择。

但希望我没有误解你想要做什么......

【讨论】:

  • 这也是我关心的“新用户界面”,逻辑丢失了。
  • 我用代码示例更新了我的初始化问题。你能谈谈你对此的看法吗?
  • 复数值绑定到项目控件。奇异值是要在项目控件中选择的默认值,例如 :)
  • 我是这么理解的,但不应该这样设计。您不希望模型上的默认值的属性。
  • 您还想要它们在哪里?你说当 UI 发生变化并且那些默认设置在那里时,它们将会丢失......我同意了。
猜你喜欢
  • 1970-01-01
  • 2011-12-06
  • 2012-09-22
  • 1970-01-01
  • 2019-11-20
  • 2020-02-02
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
相关资源
最近更新 更多