asp.net-mvc – ASP MVC3 – 如何从数据库加载页面的自定义用户定义布局?
|
我在ASP.NET MVC3中有Razor视图的在线表单构建器应用程序.
我需要用户能够自定义页面设计. 我不知道如何使用Razor和ASP.NET MVC 3. >从数据库的某处加载布局为字符串或其他 也许1-3不是做我需要的最好方法. 更新1 @inherits System.Web.Mvc.WebViewPage <body> @Html.EditorFor(z => z.Customer) </body> 并且根本不处理任何Razor语法. 解决了: 需要将此行放在Application_Start()方法中的第一行: HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider()); 更新2 protected void Application_Start()
{
HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
MyVirtualPathProvider代码是: using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Hosting;
using System.IO;
using System.Text;
namespace new_frontend
{
public class MyVirtualPathProvider : VirtualPathProvider
{
public override bool FileExists(string virtualPath)
{
var td = FindTemplate(virtualPath);
if (td == null)
{
return true;
//return base.FileExists(virtualPath);
}
else
{
return true;
}
}
public override VirtualFile GetFile(string virtualPath)
{
var td = FindTemplate(virtualPath);
if (td == null)
{
return new MyVirtualFile(virtualPath,"");
//return base.GetFile(virtualPath);
}
else
{
return new MyVirtualFile(virtualPath,td.ContentStep1);
}
}
private Facade.Dto.TemplateData FindTemplate(string virtualPath)
{
string prefix = "Template#";
int id = 0;
Facade.Dto.TemplateData td = null;
string fileName = System.IO.Path.GetFileNameWithoutExtension(virtualPath);
if (fileName.StartsWith(prefix))
Int32.TryParse(fileName.Substring(prefix.Length),out id);
if (id > 0)
td = Facade.FrontEndServices.GetTemplate(id);
return td;
}
}
public class MyVirtualFile : VirtualFile
{
private byte[] data;
public MyVirtualFile(string virtualPath,string body)
: base(virtualPath)
{ // 'System.Web.WebPages.ApplicationStartPage
string _body = /*body +*/ @"
@inherits System.Web.Mvc.WebViewPage
@using (Ajax.BeginForm(""Submit"",new AjaxOptions { UpdateTargetId = ""main"" }))
{
}
<!-- <PERSONAL_INFO> -->
<div id=""personal_info"" class=""op2-block"">
</div>
<!-- <PERSONAL_INFO> -->";
this.data = Encoding.UTF8.GetBytes(_body);
}
public override System.IO.Stream Open()
{
return new MemoryStream(data);
}
}
}
现在,对于上面定义为字符串的Razor视图代码,我得到以下异常: “编译器错误消息:CS1061:’System.Web.Mvc.AjaxHelper’不包含’BeginForm’的定义,并且没有扩展方法’BeginForm’接受类型’System.Web.Mvc.AjaxHelper’的第一个参数’ (你错过了使用指令或程序集引用吗?)“ 当我将Razor View代码更改为: string _body = /*body +*/ @"
@using System.Web.WebPages;
@using System.Web.Mvc;
@using System.Web.Mvc.Ajax;
@using System.Web.Mvc.Html;
@using System.Web.Routing;
@inherits System.Web.Mvc.WebViewPage<dynamic>
@using (Ajax.BeginForm(""Submit"",new AjaxOptions { UpdateTargetId = ""main"" }))
{
}
<!-- <PERSONAL_INFO> -->
<div id=""ppg_op2_personal_info"" class=""op2-block"">
</div>
<!-- <PERSONAL_INFO> -->";
我有一个不同的错误: 类型’ASP._Page__appstart_cshtml’不继承自’System.Web.WebPages.ApplicationStartPage’ 当我改变 @inherits System.Web.Mvc.WebViewPage 至 @inherits System.Web.WebPages.ApplicationStartPage 为了解决上面的错误,我得到一个新的错误: “编译器错误消息:CS0103:当前上下文中不存在名称’Ajax’” UPDATE3: using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Hosting;
using System.IO;
using System.Text;
namespace new_frontend
{
public class MyVirtualPathProvider : VirtualPathProvider
{
public override bool FileExists(string virtualPath)
{
var td = FindTemplate(virtualPath);
if (td == null)
{
//return true;
return base.FileExists(virtualPath);
}
else
{
return true;
}
}
public override VirtualFile GetFile(string virtualPath)
{
var td = FindTemplate(virtualPath);
if (td == null)
{
//return new MyVirtualFile(virtualPath,"");
return base.GetFile(virtualPath);
}
else
{
return new MyVirtualFile(virtualPath,string body)
: base(virtualPath)
{ // 'System.Web.WebPages.ApplicationStartPage
string _body = /*body +*/ @"
@inherits System.Web.Mvc.WebViewPage<PPG.Facade.Dto.NewOrderPageData>
@using (Ajax.BeginForm(""Submit"",new AjaxOptions { UpdateTargetId = ""main"" }))
{
}
<!-- <PERSONAL_INFO> -->
<div id=""personal_info"" class=""op2-block"">
</div>
<!-- <PERSONAL_INFO> -->";
this.data = Encoding.UTF8.GetBytes(_body);
}
public override System.IO.Stream Open()
{
return new MemoryStream(data);
}
}
}
在这种情况下,我得到一个根本没有被解析的视图,这是我在Web浏览器中得到的: @using System.Web.WebPages;
@using System.Web.Mvc;
@using System.Web.Mvc.Ajax;
@using System.Web.Mvc.Html;
@using System.Web.Routing;
@inherits System.Web.Mvc.WebViewPage<PPG.Facade.Dto.NewOrderPageData>
@using (Ajax.BeginForm("Submit",new AjaxOptions { UpdateTargetId = "main" }))
{
}
<!-- <PERSONAL_INFO> -->
<div id="ppg_op2_personal_info" class="op2-block">
</div>
<!-- <PERSONAL_INFO> -->
解决方法您应该创建一个虚拟路径提供程序,从数据库中提取自定义视图.这里有几个问题.只需搜索VirtualPathProvider 更新(从我的评论到问题讨论) >必须使用HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider())在Application_Start中注册VirtualPathProvider;>必须为您当前无法提供服务的所有文件调用基类.这是必需的,因为只能有一个VirtualPathProvider. (否则会看到很多奇怪的错误)> @model指令在您提供的文件中不起作用.您必须使用@inherits System.Web.Mvc.WebViewPage< YourNameSpace.YourModelName>代替.> IIRC您还需要覆盖GetCacheDependency并为您自己的资源返回null. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 表现 – 异步等待:他们不好吗?
- Asp.Net MVC是企业项目的合适解决方案吗?
- asp.net – MvcHtmlString.ToHtmlString()不编码HTML?
- caching – MVC4 StyleBundle:你能在Debug模式下添加一个缓
- ASP.NET错误:页面Y.ascx无法使用用户控件X.ascx
- Asp.Net Core简介与安装教程
- asp.net-mvc – 从ASP MVC 3 Preview 1升级到beta时的并发症
- ASP.NET Web窗体DropDownList具有SelectedValue,因为它不存
- asp.net-mvc – 在自定义HTML帮助器中调用Html.ActionLink
- asp经典 – 如何获得经典ASP中的当前域?
- asp.net-mvc-3 – 如何传递Request.QueryString到
- asp.net核心 – Microsoft Asp.Net 5 RC1
- asp.net – 使用app_offline.htm使应用程序脱机,
- ASP.Net MVC 3控制器操作和打开新窗口
- asp.net – 不能得到内容的内容,因为内容不是文字
- 接收“路径”选项是禁止的.“ASP.NET网站中的异常
- asp.net-mvc – 我们可以在Controller中创建静态
- 如何以编程方式测量ASP.NET中的字符串像素宽度?
- 从项目中的一个ASP.NET页面中删除主题
- asp.net – CultureInfo.CurrentCulture从中读取
