2011-07-18 34 views
21

应该将viewmodels限制为只有属性,而不是方法?带有方法的ASP.NET MVC ViewModel - 它是“合法的”吗?

比方说,我在我的视图中有一个单选按钮,并且想要查看是否应该检查单选按钮。

我能做到这一点完全是我的观点:在视图模型使用这种方法

@Html.RadioButton("radiobuttonName", "The value", Model.IsChecked(id) 

@Html.RadioButton("radiobuttonName", "The value", (id == Model.PersonId)) 

我也可以这样的逻辑移动到视图模型

public int PersonId { get;set;} 
    public bool IsChecked(int id) 
    { 
     return (id == PersonId); 
    } 

这是可以做的,还是应该完全在视图中或以其他方式完成?

+0

练习是 - 如果它赞美的话,那么是的,它是好的。 BUT可以延伸很长一段时间:)只要它以你所需要的方式去做就可以了。不要担心太多。 – ppumkin

回答

12

您的ViewModel中可以有方法。如果它是每次计算的单个结果,那么我会建议将评估代码添加到Controller并将结果存储在ViewModel中,但是如果您需要使用更动态的方法评估事物并且Property不能执行此操作这对你来说,然后在ViewModel这样做可能是好的。

在上面的示例中,我建议在ViewModel中执行此操作,因为ViewModel包含单个位置的逻辑,而不是多次复制并粘贴到您的View中。

+0

据说在ViewModel中根本不应该存在任何逻辑。这是最好的编码实践。但是,通过调用一个函数来让viewModel在回发中更新其所有属性是很好的功能。 (业务逻辑是分开的,只有Linq和获取数据)我意识到,如果你不要在你的视图中声明一个属性WONT发送给客户端的属性,那么。所以它是“受保护的” - 只要注意什么以及如何暴露属性:) – ppumkin

4

这是一个关于正确放置逻辑的非常好的问题。你的做法肯定是合法 - 但它是否遵循MVC的精神? :)

我会说这取决于你的方法的逻辑是否适用于只是这个视图/视图模型,或可能有潜在应用到与此基础模型类型对付其他的ViewModels(在你的情况, )。

如果这是针对此特定ViewModel的一次性计算,请将其保留在模型中。如果此计算一般可用于Person对象,请考虑使用静态Service类,例如PersonService,并将您的方法放在那里。

相关问题