我一直在搜索SO和Google,了解可用于ASP.NET MVC的各种视图引擎,但是没有找到比视图引擎的简单高级描述更多的内容.
我不一定在寻找"最佳"或"最快",而是在各种情况下对主要参与者(例如默认的WebFormViewEngine,MvcContrib View Engines等)的优缺点进行实际比较.我认为这对确定从默认引擎切换是否对给定项目或开发组有利有用.
有没有人遇到这样的比较?
如何在视图中获取错误集合?
我不想使用Html Helper验证摘要或验证消息.相反,我想检查错误,如果有任何显示特定格式.另外在输入控件上我想检查特定的属性错误并在输入中添加一个类.
PS我正在使用Spark View Engine,但这个想法应该是一样的.
所以我想我可以做点像......
<if condition="${ModelState.Errors.Count > 0}">
DispalyErrorSummary()
</if>
....and also...
<input type="text" value="${Model.Name}"
class="?{ModelState.Errors["Name"] != string.empty} error" />
....
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
UPDATE
我的最终解决方案如下所示:
<input type="text" value="${ViewData.Model.Name}"
class="text error?{!ViewData.ModelState.IsValid &&
ViewData.ModelState["Name"].Errors.Count() > 0}"
id="Name" name="Name" />
Run Code Online (Sandbox Code Playgroud)
如果此属性有错误,则仅添加错误css类.
假设我有ViewModel之类的
public class AnotherViewModel
{
public string Name { get; set; }
}
public class MyViewModel
{
public string Name { get; set; }
public AnotherViewModel Child { get; set; }
public AnotherViewModel Child2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在视图中,我可以渲染部分
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
Run Code Online (Sandbox Code Playgroud)
在部分我会做
<%= Html.TextBox("Name", Model.Name) %>
or
<%= Html.TextBoxFor(x => x.Name) %>
Run Code Online (Sandbox Code Playgroud)
但是,问题是两者都将呈现name ="Name",而我需要name ="Child.Name"才能使模型绑定器正常工作.或者,当我使用相同的局部视图渲染第二个属性时,name ="Child2.Name".
如何使我的局部视图自动识别所需的前缀?我可以将它作为参数传递,但这太不方便了.当我想要例如以递归方式呈现它时,情况会更糟.有没有办法用前缀渲染部分视图,或者更好的是,通过自动重新调用lambda表达式来实现
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
Run Code Online (Sandbox Code Playgroud)
会自动添加正确的"孩子".生成的名称/ id字符串的前缀?
我可以接受任何解决方案,包括第三方视图引擎和库 - 我实际上使用Spark View引擎(我使用它的"解决"问题)和MvcContrib,但没有在那里找到解决方案.XForms,InputBuilder,MVC v2 - 提供此功能的任何工具/洞察都会很棒.
目前我考虑自己编码,但这似乎是浪费时间,我不敢相信这些琐碎的东西还没有实现.
可能存在许多手动解决方案,欢迎所有这些解决方案.例如,我可以强制我的部分基于IPartialViewModel <T> {public string Prefix; T模型; …
我的客户端应用程序需要生成HTML.我想使用像Spark这样的模板/视图引擎解决方案,但我不确定Spark是否可以在ASP.NET应用程序之外使用.有没有人知道以这种方式使用Spark的任何样本或文档?
(如果您知道可以单独使用的其他视图引擎解决方案,我也很想知道这些.)
我只是好奇是否已经存在任何匹配/类似于开箱即用的Web表单视图模板(创建,编辑,详细信息等)的Spark T4模板.我的Google技能并没有让我得到任何结果.
为ASP.NET MVC项目使用Spark视图引擎的优点(正面).为什么它比默认视图引擎更好?
他们是使用ASP.NET MVC View生成电子邮件模板的解决方案,而不必跳过篮球.
让我详细说明跳过篮球.
var fakeContext = new HttpContext(HttpContext.Current.Request, fakeResponse);
var oldContext = HttpContext.Current;
HttpContext.Current = fakeContext;
var html = new HtmlHelper(new ViewContext(fakeControllerContext,
new FakeView(), viewDataDictionary, new TempDataDictionary()),
new ViewPage());
html.RenderPartial(viewName, viewData, viewDataDictionary);
HttpContext.Current = oldContext;
Run Code Online (Sandbox Code Playgroud)
上面的代码使用当前的HttpContext伪造一个新的Context并使用RenderPartial渲染页面,我们不应该这样做.
使用ControllerContext和.Render的另一个非常详细的解决方案:(IEmailTemplateService,Headers/Postback WorkAround),但是使用更多代码几乎做同样的事情.
另一方面,我正在寻找能够呈现View而不必POST/GET的东西,并生成一个简单的字符串,我可以通过我的电子邮件代码发送.不会发生错误的事情,例如发布标题两次或伪造一些数据.
EX:
//code which does not fire Render, RenderPartial... etc
var email = emailFramework.Create(viewData, view);
Run Code Online (Sandbox Code Playgroud)
请参阅我的解决方案或点击此链接:
我的解决方案使用spark:(12/30/2009)ASP.NET MVC电子邮件模板解决方案
最近一直在与ASP.MVC 2进行大规模的学习狂欢,最近发现有不同的渲染引擎...... Spark引起了我的注意,但有几件事情.
你的想法是什么?我倾向于它可能不值得...
我创建了一个简单的ASP.NET MVC 1.0版应用程序.我有一个ProductController,它有一个动作索引.在视图中,我在Product子文件夹下创建了相应的Index.aspx.
然后我引用了Spark dll并在同一Product视图文件夹下创建了Index.spark.Application_Start看起来像
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new Spark.Web.Mvc.SparkViewFactory());
ViewEngines.Engines.Add(new WebFormViewEngine());
}
Run Code Online (Sandbox Code Playgroud)
我的期望是,由于Spark引擎在默认WebFormViewEngine之前注册,当浏览Product controller中的Index操作时,应该使用Spark引擎,并且WebFormViewEngine应该用于所有其他URL.
但是,测试显示Product控制器的Index操作也使用WebFormViewEngine.
如果我注释掉WebFormViewEnginer的注册(代码中的最后一行),我可以看到Index动作由Spark引擎呈现,其余的URL生成错误(因为defualt引擎已经消失),它证明了我所有的Spark代码是正确的.
现在我的问题是视图引擎是如何解决的?为什么注册序列不生效?
我们正在构建一个代码非常少的网站,它主要是提供一堆静态页面.我知道随着时间的推移会发生变化,我们会想要交换更多动态信息,因此我决定继续使用ASP.NET MVC2和Spark视图引擎构建Web应用程序.将有一些控制器必须进行实际工作(如/ products区域),但大多数都是静态的.
我希望我的设计师能够构建和修改网站,而无需每次他们决定添加或移动页面时都要求我编写新的控制器或路由.因此,如果他想添加一个" http://example.com/News "页面,他只需在Views下创建一个"News"文件夹,并在其中放置一个index.spark页面.然后,如果他决定要一个/新闻/社区页面,他可以删除该文件夹中的community.spark文件并让它工作.
通过使控制器覆盖HandleUnknownAction,我可以在没有特定操作的情况下获得视图,但我仍然需要为每个文件夹创建一个控制器.每次他们决定向网站添加区域时,必须添加一个空控制器并重新编译似乎很愚蠢.
有没有办法让这更容易,所以我只需要编写一个控制器并重新编译,如果有实际的逻辑要做?某种"主"控制器将处理没有定义特定控制器的任何请求?
asp.net-mvc ×8
c# ×2
viewengine ×2
email ×1
html ×1
mvccontrib ×1
razor ×1
t4 ×1
templates ×1
validation ×1