2013-03-22 61 views
0

我開始使用帶有asp.net MVC的DurandalJs框架。它運作完美。如何在Durandal中使用.cshtml和.html文件

但現在我需要使用.cshtml文件作爲durandal的視圖。所以我添加到根目錄web.config

<add key="webpages:Enabled" value="true" /> 

但DurandalJs仍然嘗試獲取.html文件作爲視圖。

所以我糾正viewEngine.js文件:

return { 
    viewExtension: '.cshtml', 
    viewPlugin: 'text', 

但現在DurandalJs要求所有意見的文件應該有 「.cshtml」 擴展名。

那麼我可以一起使用「.html」和「.cshtml」文件嗎?

回答

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; 
    } 
} 

所以現在迪朗達爾應用程序可以與.html和.cshtml工作。

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

相關問題