ASP.Net Mvc - View是否可以调用可能导致数据检索的函数?

Ash*_*Ash 8 c# model-view-controller asp.net-mvc

我现在正在使用Asp.Net mvc框架并且喜欢它与经典的asp.net方式相比.我要说的一件事是,View是否可以接受(间接)访问数据库?

例如,我使用控制器来填充自定义数据类,其中包含我认为View需要执行其工作的所有信息,但是当我将对象传递给视图时,它也会导致数据库读取.

一个快速的伪示例.

public interface IProduct
{
    /* Some Members */

    /* Some Methods */
    decimal GetDiscount();
}

public class Product : IProduct
{
    public decimal GetDiscount(){ ... /* causes database access */ }
}
Run Code Online (Sandbox Code Playgroud)

如果View可以访问Product类(它传递了一个IProduct对象),它可以调用GetDiscount()并导致数据库访问.

我在想办法防止这种情况发生.目前我只为Product该类提供多个接口继承.相反,仅仅实现IProduct的,现在将执行IProductIProductView.IProductView将列出该类的成员,IProduct将包含可能导致数据库访问的方法调用.

"视图"只会知道IProductView类的接口,并且无法调用导致数据访问的方法.

在将对象传递给视图之前,我还有其他关于"锁定"对象的模糊想法,但我可以预见到这种方法可以产生巨大的副作用.

所以,我的问题:

  • 有关此问题的最佳做法吗?
  • 使用MVC的其他人如何阻止View顽皮并对对象做更多的事情呢?

Mik*_*ott 3

您的视图并没有真正引起数据访问。视图只是调用模型接口中的 GetDiscount() 方法。这是导致数据访问的模型。事实上,您可以创建 IProduct 的另一个实现,它不会导致数据访问,但视图不会发生任何更改。

当视图尝试提取数据进行显示时,执行延迟加载的模型对象总是会导致数据访问。

是否可以取决于个人品味和喜好。

但是,除非您有充分的理由进行延迟加载,否则我更愿意将数据加载到模型对象中,然后传递“准备好的”数据以供视图显示。