【问题标题】:Asp.Net MVC setting ViewModel property valueAsp.Net MVC 设置 ViewModel 属性值
【发布时间】:2014-07-09 08:05:02
【问题描述】:

我有一种情况,我必须根据某些情况更新视图模型属性。 要更新的 viewmodel 属性是 IsPrintable 基于 IsPrintableFlag() 结果。 目前我正在从控制器更新属性,例如 model.IsPrintable = model.IsPrintableFlag(items, pages);

我的问题是 我们是否可以选择在 viewmodel 中设置属性值,而不是从 Controller 更新 Viewmodel 属性?

ViewModel 代码:

public bool IsPrintable { get; set; }

public bool IsPrintableFlag(IList<Items> items,IList<Pages> pages )
        {
            switch (id)
            {
                case 1:
                case 2:
                    if (!pages.Any())
                    {
                        return pages.Any();
                    }
                    break;

                case 3:
                    return false;
                default:
                    return false;
            }

            return false;
        }

控制器代码:

model.IsPrintable = model.IsPrintableFlag(items, pages);

【问题讨论】:

  • 您可能对this answer 感兴趣,它解释了如何在 MV(C)VM 架构的上下文中查看 James 的服务层。

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


【解决方案1】:

视图模型不应该真正包含逻辑,它应该只包含视图所需的数据。在控制器中填充视图模型很好。

我建议你引入一个服务层来包装这种类型的逻辑,例如

public class MyDomainService
{
    public bool IsPrintable(IList<Items> items, IList<Pages> pages)
    {
        return ...;
    }
}
...
model.IsPrintable = domainSvc.IsPrintable(items, pages);

或者,您可以扩展它以返回完全填充的视图模型

public MyViewModel GetViewModel(...)
{
    var model = ...;
    model.IsPrintable = this.IsPrintable(items, pages);
    return model;
}

【讨论】:

    【解决方案2】:

    得到了我的问题的答案并希望分享,以便可能对可能面临类似问题的许多人有用。

    实际上,您甚至可以在 IsPrintableFlag() 方法中设置值,这样您就不需要使用以下方法返回布尔值:

    // Define this method within your ViewModel class
    public void SetPrintableFlag(IList<Items> items, IList<Pages> pages)
    {
          // Assuming id is a property of your ViewModel class
          switch (id)
          {
                    case 1:
                    case 2:
                        // If there aren't any pages
                        if (!pages.Any())
                        {
                            // Then set your flag to the opposite (you could likely return true here instead)
                            IsPrintableFlag = pages.Any();
                        }
                        break;
                    case 3:
                    default:
                        IsPrintableFlag = false;
          }
    }
    

    控制器代码

    model.SetPrintableFlag(items,pages);
    

    【讨论】:

    • 这个解决方案不仅打破了应该如何使用视图模型的一般规则,而且过于复杂(你甚至不需要 switch 语句)。
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多