在ViewModel中访问数据库与MVC中的控制器

时间:2018-06-19 12:28:33

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

假设我有ViewModel

public class TestViewModel
{
    public string Description { get; set; }
    public string Link { get; set; }
}

然后在我的控制器中

var model = new TestViewModel();
var obj = _uow.CallDB(); //call database
model.Description = obj.Description;
model.Link = obj.Link;

return View(model);

我发现我最终一遍又一遍地使用相同的代码,尤其是当在许多页面中使用TestViewModel时。如果我做类似

ViewModel

public class TestViewModel
{
    public class TestViewModel(bool init = false)
    {
        if (init)
        {
             var obj = _uow.CallDB(); //call database
             Description = obj.Description;
             Link = obj.Link;
        }
    }

    public string Description { get; set; }
    public string Link { get; set; }
}

控制器

var model = new TestViewModel(true);
return View(model);

我知道将数据库调用放入ViewModel违反了该原理,但是还有什么更有效的方法,而不必一次又一次地在控制器中写入相同的内容吗?

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

您可以从数据库实体到ViewModel创建一个implicit conversion。这样,您可以简单地将数据库模型分配给视图模型

void Main()
{
    DBModel t = new DBModel() { Description = "Google", Link = "http://www.google.com"};

    // Here the implicit conversion happens....
    // a DBModel is converted in a TestViewModel
    TestViewModel k = t;
    Console.WriteLine(k.Description);
    Console.WriteLine(k.Link);

    // This means that you could write this
    TestViewModel model = _uow.CallDB();
}

public class TestViewModel
{
    public string Description { get; set; }
    public string Link { get; set; }

    public static implicit operator TestViewModel(DBModel source)
    {
        if (source == null) return null;
        TestViewModel model = new TestViewModel()
        {
            Description = source.Description,
            Link = source.Link
        };
        return model;
    }
}

public class DBModel
{
    public string Description { get; set; }
    public string Link { get; set; }
}

当然,您可以为将来的任何需求扩展隐式转换。