Asp.Net MVC设置ViewModel属性值

时间:2014-07-09 08:05:02

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

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

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

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);

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

您甚至可以在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);