部署未编译的ASP.NET MVC Razor应用程序

时间:2014-01-07 21:25:17

标签: asp.net-mvc asp.net-mvc-4 razor customization

问题“https://stackoverflow.com/questions/16397785/add-pages-to-mvc-deployed-website”似乎与我想问的问题密切相关。但是我的情况是,我还没有开发一个应用程序,但是我希望以这样的方式开发它,以便用户在部署之后通过向已部署的目录添加文件来自定义它。这样做的可取方法是什么?具体来说,我希望用户能够定义自定义页面,可能替换现有页面或向现有页面添加控件,并可能定义自定义WebAPI函数以检索自定义数据。我尝试将.vbhtml文件添加到Views目录中,但遇到了链接问题中描述的相同问题。

4 个答案:

答案 0 :(得分:0)

我认为我不建议使用文件系统。我认为您应该将剃刀代码保存到数据库中,然后,当您希望解析它时,您可以根据此Using RazorEngine to parse Razor templates concurrently

执行此操作。

这是另一个例子:

var model = new { Name = "Test" };
var template = "Hello @Model.Name";

var result = Razor.Parse(template, model);

代码来自Using Razor engine on strings - not views

编辑以回答您的问题:

剃刀代码将与您想要运行它的任何控制器一起存储在数据库中。当您从数据库中检索剃刀代码时,您也会知道控制器,然后您可以重定向到该控制器,将所需的任何模型发送到剃刀代码,然后如上所示进行解析。有意义吗?

答案 1 :(得分:0)

Razor视图是在运行时编译的,所以你总是将它们部署为未编译的。

你想要的只是Razor页面,所以可以将它们添加到任何目录(而不是视图)并在没有文件扩展名的情况下访问它们(例如/ Foo / Bar而不是/Foo/Bar.vbhtml)。

答案 2 :(得分:0)

可以自定义路由配置,以识别标识所有自定义代码请求的URL模式,并通过公共控制器路由它们,然后公共控制器可以根据URL中提供的信息加载任意视图。请注意下面名称为Custom的路线,以及它如何始终使用名为Index的控制器的Custom操作,但会引入新参数customization

Public Class RouteConfig
   Public Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

      routes.MapRoute( _
         name:="Custom", _
         url:="custom/{customization}/{id}", _
         defaults:=New With {.controller = "Custom", .action = "Index", .id = UrlParameter.Optional} _
      )

      routes.MapRoute( _
            name:="Default", _
            url:="{controller}/{action}/{id}", _
            defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
        )
   End Sub
End Class

设置完成后,将一个名为CustomController的控制器添加到项目中,该控制器只是传递给由customization参数确定的视图:

Public Class CustomController
   Inherits System.Web.Mvc.Controller

   '
   ' GET: /Custom

   Function Index(customization As String) As ActionResult
      Return View(customization)
   End Function

End Class

发布此代码并在部署位置的Custom目录下添加Views目录。现在,您可以将任何.vbhtml文件放在Custom文件夹中,并使用http://localhost/MyApplication/Custom/MyView之类的网址引用该文件,该网址将从MyView.vbhtml目录加载Views\Custom

答案 3 :(得分:0)

如果主要目的是提供可扩展性,那么答案就更简单了。 ASP.Net将探测已部署的Web应用程序的bin目录中的所有程序集,并在那里获取已编译程序集中的所有控制器和模型,以及Views目录中的所有未编译的视图。通过一些努力,我能够确定创建独立模板项目所需的最小文件集,可供开发和部署自定义代码到运行(部署)Web应用程序的人使用。提供的详细信息是对我在此主题中发现的更相关问题的回答,因为获得此模板项目的Intellisense和其他ASP.Net MVC4方案并不简单。见https://stackoverflow.com/a/21122377/78162

由于Visual Studio Express现在免费提供,我希望可以加载这样的模板项目作为开发自定义到另一个ASP.Net MVC4应用程序的起点。我的有限测试表明这将适用于UI层(如前面的链接所示)和API层(如https://stackoverflow.com/a/21028825/78162中所述)。