【问题标题】:Can I simplify this C# in my ViewModel?我可以在我的 ViewModel 中简化这个 C# 吗?
【发布时间】:2011-11-11 02:48:40
【问题描述】:

在我的代码中,我有以下内容:

    viewModel.Note.Modified = DateTime.Now;
    viewModel.Note.ModifiedBy = User.Identity.Name;

在我看来:

    [DisplayName("Modified")]
    public DateTime Modified { get; set; }
    [DisplayName("Modified By")]
    public string ModifiedBy { get; set; }

我是否可以让我的代码更改 ModifiedBy,然后让一些在 ViewModel 中运行的代码在修改者更改时更改修改日期?

【问题讨论】:

  • 您可以在视图模型的“ModifiedBy”设置器中添加逻辑,这样每次“ModifiedBy”被更改时,“Modified”字段也会更新。

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-viewmodel


【解决方案1】:

执行此操作的方式取决于您希望在视图中显示多少逻辑。如果你不介意那里的一些逻辑,你可以这样做:

[DisplayName("Modified")]
public DateTime Modified { get; set; }

private string m_ModifiedBy
[DisplayName("Modified By")]
public string ModifiedBy { 
    get { return m_ModifiedBy; }
    set{ m_ModifiedBy = value; Modified = DateTime.Now; }
}

如果你想要 ViewModel 中的逻辑,你可以这样做:(假设 viewModel 是一个类变量)

public void SetModifiedBy(string modifiedBy) {
    viewModel.Note.Modified = DateTime.Now;
    viewModel.Note.ModifiedBy = modifiedBy;
}

然后您只需调用SetModifiedBy(User.Identity.Name),两个值都会更新。

【讨论】:

  • 您的两个示例都是视图模型中的逻辑示例。第一个不是视图中的逻辑示例。
  • 根据您的经验,您认为哪种方法最好?还有其他选择吗?
  • 我更喜欢第一种方法,即在 ModifiedBy 属性中使用 setter。
  • 我同意帕万·米什拉的观点。我认为第一种方法更好。
【解决方案2】:

如果viewModel.Note 是对NoteViewModel 实例的引用,那么您可以使用以下内容:

public class NoteViewModel{    
    private DateTime? m_Modified;
    private string m_ModifiedBy;

    // note that you do not need the DisplayNameAttribute, because the default 
    // display name is the property name
    public DateTime Modified { 
      get { return m_Modified ?? DateTime.Now; } 
    }

    [DisplayName("Modified By")]
    public string ModifiedBy {
      get { return m_ModifiedBy ?? string.Empty; }
      set { 
        if(value!=null) {
            m_ModifiedBy = value;
            m_Modified = DateTime.Now;       
        }
      }
    } 
}

然后在你的“代码”中(我猜你的意思是控制器?),你可以这样做:

 viewModel.Note.ModifiedBy = User.Identity.Name;

您将获得预期的结果。

旁注:根据您的应用程序的受众,您可能需要考虑使用DateTime.UtcNow 进行本地化。 DateTime.Now 将返回服务器上的当前日期时间,这取决于服务器的位置。如果您要向用户显示此数据,您可能希望 (a) 指定时区,或 (b) 将时间本地化到客户端计算机的时区

【讨论】:

    猜你喜欢
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多