Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何从业务层程序集中获取视图的路径?_Asp.net Mvc_Asp.net Mvc 3_Io - Fatal编程技术网

Asp.net mvc 如何从业务层程序集中获取视图的路径?

Asp.net mvc 如何从业务层程序集中获取视图的路径?,asp.net-mvc,asp.net-mvc-3,io,Asp.net Mvc,Asp.net Mvc 3,Io,我试图将视图的内容读入字符串变量,如下所示- string\u template=File.ReadAllText(@“Views/email/registrationconfirmation.cshtml”) 这样就可以使用它从模板创建电子邮件 此代码位于我的业务层程序集中。我想我需要的是物理路径,而不是我试图使用的虚拟路径 该文件位于我的MVC3项目的Views/emails文件夹中。如何通过编程获得读取文件所需的正确路径 对您的案例有效吗?您的业务层不应该试图获取视图的路径。如果它需要处理

我试图将视图的内容读入字符串变量,如下所示-

string\u template=File.ReadAllText(@“Views/email/registrationconfirmation.cshtml”)

这样就可以使用它从模板创建电子邮件

此代码位于我的业务层程序集中。我想我需要的是物理路径,而不是我试图使用的虚拟路径


该文件位于我的MVC3项目的
Views/emails
文件夹中。如何通过编程获得读取文件所需的正确路径

对您的案例有效吗?

您的业务层不应该试图获取视图的路径。如果它需要处理这些路径,那么它们应该作为参数从UI层传递

因此,在您的业务层中,而不是:

public class MyBusiness : IMyBusiness
{
    public string RenderView()
    {
        string _template = File.ReadAllText(@"Views/emails/registrationconfirmation.cshtml");
        ...
    }
}
你可以这样做:

public class MyBusiness
{
    public string RenderView(string viewPath)
    {
        string _template = File.ReadAllText(viewPath);
        ...
    }
}
现在,位于控制器中的调用代码负责传递正确的路径(对于ASP.NET应用程序,可以使用
Server.MapPath
函数获取路径,对于桌面应用程序,可以是相对路径等等)。这样,您的业务层就不再与ASP.NET强耦合

另一种可能是让业务层将应用程序的基本物理路径作为构造函数参数:

public class MyBusiness : IMyBusiness
{
    private readonly string _basePath;
    public MyBusiness(string basePath)
    {
        _basePath = basePath;
    }

    public string RenderView()
    {
        var file = Path.Combine(_basePath, @"Views\emails\registrationconfirmation.cshtml");
        string _template = File.ReadAllText(viewPath);
        ...
    }
}
然后剩下的就是配置DI框架,以便在实例化业务层时传递属性值



更新:正如@jgauffin在评论部分所指出的,可以通过将
流阅读器
传递到业务层来进一步改进此代码,这样它甚至不依赖于文件。这将使完全隔离的重用和单元测试更加容易。

您评估过ActionMailer.NET吗?它值得一看,可以通过NuGet安装。谢谢,我将研究这个独立版本。事实上,我读到它使用了RazorEngine,这很有趣。谢谢你的链接!我宁愿将
传递给业务层。@jgauffin,是的
,这是个好主意。这样,业务层代码甚至不依赖于文件,可以很容易地进行单独的单元测试。我将更新我的帖子以考虑到这一点。@Darin,谢谢你提供了这两种技巧。有一个问题,如果我要传递一个
,那实际上是传递一个引用还是复制整个流?谢谢,流总是一个参考。我不认为它是。
服务器
对象似乎在业务层程序集中不可用。我认为它在MVC应用程序组装之外不起作用。谢谢你。