【问题标题】:Moving logic from View to Controller and ViewModel将逻辑从 View 移动到 Controller 和 ViewModel
【发布时间】:2013-01-25 04:44:45
【问题描述】:

我正在移动所有定义,如下所示:

 @(Model.Store.EmployeeType.Name == "Manager" ? Model.Store.HQ.Manager.DisplayName : Model.Store.Manager.DisplayName )

走出我的视野并进入viewModel:

public class ManagerViewModel 
{
    public string Manager {get;set;}
}

并在控制器中定义它们:

var viewModel = new ManagerViewModel();

viewModel.Manager = Model.Store.EmployeeType.Name == "Manager" ? Model.Store.HQ.Manager.DisplayName : Model.Store.Manager.DisplayName;

return View(viewModel);

现在,在我看来,我可以这样做:

@Model.Manager

我的问题是 - 这是否违反了瘦控制器的最佳实践?我有大约 30 个字段需要这种类型的处理,所以我的控制器会非常大 - 我正在为每个字段创建一个新属性。

【问题讨论】:

    标签: asp.net-mvc model-view-controller asp.net-mvc-4


    【解决方案1】:

    不要太担心premature optimization。我认为您在这方面走在正确的道路上,不必担心太多。

    如果您真的担心“瘦”控制器,可以从构造函数中填充 ViewModel。

    public class ManagerViewModel 
    {
    
        public ManagerViewModel(ManagerModel model){
            // initialize in here
            this.Manager = model.Store.EmployeeType.Name == "Manager" ? model.Store.HQ.Manager.DisplayName : model.Store.Manager.DisplayName;
        }
    
        public string Manager {get;set;}
    }
    
    var viewModel = new ManagerViewModel(model);
    return View(viewModel);
    

    【讨论】:

    • 谢谢蔡斯。如果我在详细信息页面上工作,这将如何改变?如果我初始化 viewModel 中的所有内容,“var manager = db.Managers.Find(id);”在哪里?去吗?
    • 每个视图都应该有自己的视图模型。因此,您需要ManagersViewModel(经理列表)和ManagerViewModel(单个经理的详细信息。)
    • ps:我假设您当前的ManagerViewModel 是一个详细信息视图。如果不是,请详细说明它是什么。
    • 这是一个详细信息视图。使用 ManagerViewModel(model),您是否将我之前评论中的“manager”作为“model”传递给 ViewModel?
    • 太棒了。非常感谢。
    猜你喜欢
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多