我开始在asp.net MVC中使用DurandalJs框架。它工作得很完美。
但是现在我需要使用.cshtml文件作为durandal的视图。所以我添加到root web.config
<add key="webpages:Enabled" value="true" />
但是DurandalJs仍然试图将.html文件作为视图。
所以我更正viewEngine.js文件:
return {
viewExtension: '.cshtml',
viewPlugin: 'text',
但是现在DurandalJs要求所有视图文件都应该有“.cshtml”扩展名。
我可以一起使用“.html”和“.cshtml”文件吗?
答案 0 :(得分:2)
在main.js中我添加了行:
viewLocator.useConvention('viewmodels', 'ViewsProxy/GetView?name=', 'ViewsProxy/GetView?name=');
并实现了ViewsProxyController,如下所示:
public class ViewsProxyController : Controller
{
public ActionResult GetView(string name)
{
string viewRelativePath = GetRelativePath(name);
string viewAbsolutePath = HttpContext.Server.MapPath(viewRelativePath);
if (!System.IO.File.Exists(viewAbsolutePath))
{
viewAbsolutePath = ReplaceHtmlWithCshtml(viewAbsolutePath);
if (System.IO.File.Exists(viewAbsolutePath))
{
System.Web.HttpContext.Current.Cache.SetIsHtmlView(name, false);
viewRelativePath = ReplaceHtmlWithCshtml(viewRelativePath);
return PartialView(viewRelativePath);
}
throw new FileNotFoundException();
}
FilePathResult filePathResult = new FilePathResult(viewAbsolutePath, "text/html");
return filePathResult;
}
private string ReplaceHtmlWithCshtml(string path)
{
string result = Regex.Replace(path, @"\.html$", ".cshtml");
return result;
}
private string GetRelativePath(string name)
{
string result = string.Format("{0}{1}", AppConfigManager.DurandalViewsFolder, name);
return result;
}
}
所以现在,durandal应用程序可以使用.html和.cshtml。
答案 1 :(得分:1)
您需要更改路由以接受cshtml作为MVC路由的扩展。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}.cshtml",
defaults: new { controller = "Home", action = "Index", namespaces: new string[] { "PAWS.Web.Controllers" }
);
此外,您需要确保您的应用程序池在集成而非经典下运行。
但我不建议这样做。您应该尝试不让服务器呈现任何HTML。解释原因here
答案 2 :(得分:0)
查看Durandal viewEngine
和viewLocator
自定义设置,允许同时使用本地“.html”和远程“.cshtml”视图。