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