我正在尝试将视图的内容读入一个字符串变量,如下所示 -
string _template = File.ReadAllText(@"Views/emails/registrationconfirmation.cshtml");
这样它就可以与RazorEngine一起使用,从模板创建电子邮件。
此代码在我的业务层程序集中。我想我需要物理路径而不是我试图使用的虚拟路径。
该文件位于Views/emails
我的 MVC3 项目的文件夹中。如何以编程方式获取读取文件所需的正确路径?
我正在尝试将视图的内容读入一个字符串变量,如下所示 -
string _template = File.ReadAllText(@"Views/emails/registrationconfirmation.cshtml");
这样它就可以与RazorEngine一起使用,从模板创建电子邮件。
此代码在我的业务层程序集中。我想我需要物理路径而不是我试图使用的虚拟路径。
该文件位于Views/emails
我的 MVC3 项目的文件夹中。如何以编程方式获取读取文件所需的正确路径?
您的业务层不应该尝试获取视图的路径。如果它需要使用这样的路径,它们应该作为来自 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 框架以HostingEnvironment.ApplicationPhysicalPath
在实例化您的业务层时传递属性值。
更新:正如@jgauffin 在评论部分指出的那样,可以通过将 aStream
或 a传递StreamReader
给业务层来进一步改进此代码,使其甚至不依赖于文件。这将使完全隔离的重用和单元测试变得更加容易。
Server.MapPath是否适用于您的情况?