我有一个使用Razor视图引擎在ASP.NET MVC中运行的大型站点.
我有一个基本样式表,其中包含整个站点的所有通用样式.但是,有时候,我在页面中有页面特定的样式<head>- 通常这是一行或两行.
我并不特别喜欢将CSS放入<head>其中并不严格区分关注点,但对于一两行,这确实是特定于该页面的,我更喜欢不必附加另一个文件并添加到带宽中.
我有一个实例虽然我想将页面特定的媒体查询放入其中<head>,但因为媒体查询使用@符号和括号{}它与剃刀语法冲突:
@section cphPageHead{
<style>
/* PAGE SPECIFIC CSS */
...
@media only screen and (max-width : 960px) <-- the @ symbol here is clashing!
{
... }
}
</style>
}
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题?
我刚刚创建了一个ASP.NET MVC 4项目,并使用Visual Studio 2012 RC创建了一个Controller和Razor Views for Index和CreateActions.
当我来运行应用程序并浏览到Create视图时,显示以下错误:
编译器错误消息:CS0103:当前上下文中不存在名称"脚本"
问题是以下代码自动添加到视图的底部:
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Run Code Online (Sandbox Code Playgroud)
为什么Scripts不存在?
我查看了Assembly System.Web.Mvc.dll,v4.0.0.0中的基本Web页面类
我可以看到以下帮助器属性:
但没有任何一个名为Scripts.
有任何想法吗?
编辑:
我的Web.config文件看起来像这样(不受Visual Studio创建的那个):
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
Run Code Online (Sandbox Code Playgroud)
编辑#2:
人们正在写关于使用@Scripts帮助者的博客:
然而,刚刚将Visual Studio 2012 RC安装到新的Windows 8安装上,@Scripts即使Visual Studio将其添加到生成的View中,我仍然无法使用!
解决方案如下.
我不知道如何关闭它,因为最终更新似乎解决了这个问题.我仔细检查了我使用新项目执行了干净安装.但是,我所做的同样失败的项目现在可以在各种更新后进行,并且没有人工明显的干预.感谢所有的想法,但当时肯定存在问题;)
这是默认MVC 3模板中的About.cshtml:
@{
ViewBag.Title = "About Us";
}
<h2>About</h2>
<p>
Put content here.
</p>
Run Code Online (Sandbox Code Playgroud)
我希望能找到对_ViewStart文件的引用About.cshtml,但显然不是.
我看着在global.asax和web.config,但我不能找出如何将About.cshtml文件"链接"从_ViewStart文件的布局.
一切都按预期工作,我只想知道引擎盖下发生了什么......
例如@Html.ActionLink(),ASP.NET MVC可以使用HTML Helpers生成HTML元素,@Html.BeginForm()依此类推.
我知道我可以通过创建一个匿名对象来指定表单属性,并将该对象传递给(在本例中为第四个)htmlAttributes参数,其中id为元素指定一个:
Html.BeginForm("Foo", "Bar", FormMethod.Post, new { id = "MyForm"})
Run Code Online (Sandbox Code Playgroud)
但class属性怎么样?显然这不起作用:
Html.BeginForm("Foo", "Bar", FormMethod.Post, new { class = "myclass"})
Run Code Online (Sandbox Code Playgroud)
因为在请求我的视图时,它只会抛出随机语法错误,因为它在遇到C#关键字后需要其他东西class.
我也尝试过:
new { _class = "myclass"}
Run Code Online (Sandbox Code Playgroud)
和
new { class_ = "myclass"}
Run Code Online (Sandbox Code Playgroud)
但它们也没有用,因为下划线被短划线取代.
我知道我也可以手工编写HTML元素或将表单包装在一个内部<div class="myClass">,但我仍然有兴趣知道它应该如何完成.
我的模型中有一个名为"Promotion"的属性,它的类型是一个名为"UserPromotion"的标志枚举.我的枚举成员的显示属性设置如下:
[Flags]
public enum UserPromotion
{
None = 0x0,
[Display(Name = "Send Job Offers By Mail")]
SendJobOffersByMail = 0x1,
[Display(Name = "Send Job Offers By Sms")]
SendJobOffersBySms = 0x2,
[Display(Name = "Send Other Stuff By Sms")]
SendPromotionalBySms = 0x4,
[Display(Name = "Send Other Stuff By Mail")]
SendPromotionalByMail = 0x8
}
Run Code Online (Sandbox Code Playgroud)
现在我希望能够在我的视图中创建一个ul来显示我的"Promotion"属性的选定值.这是我到目前为止所做的,但问题是如何在这里获取显示名称?
<ul>
@foreach (int aPromotion in @Enum.GetValues(typeof(UserPromotion)))
{
var currentPromotion = (int)Model.JobSeeker.Promotion;
if ((currentPromotion & aPromotion) == aPromotion)
{
<li>Here I don't know how to get the display attribute of …Run Code Online (Sandbox Code Playgroud) 我正在尝试为输入添加一个类.
这不起作用:
@Html.EditorFor(x => x.Created, new { @class = "date" })
Run Code Online (Sandbox Code Playgroud) 我知道如何在_Layout.cshtml文件上设置.css文件,但是基于每个视图应用样式表呢?
我的想法是,在_Layout.cshtml中,你有<head>标签可以使用,但在你的一个非布局视图中却没有.哪里的<link>标签去?
在我的MVC 4应用程序中进行了重大的重构之后,Razor在调试Views时显示了这个错误:
当前上下文中不存在名称"model".
这是令人讨厌的代码行:
@model ICollection<DataSourceByActive>
Run Code Online (Sandbox Code Playgroud)
我知道使用@model是正确的.
为什么会这样?我该如何解决?
布局页面头:
<head>
<link href="@Url.Content("~/Content/themes/base/Site.css")"
rel="stylesheet" type="text/css" />
</head>
Run Code Online (Sandbox Code Playgroud)
应用程序需要的View(AnotherView):
<link href="@Url.Content("~/Content/themes/base/AnotherPage.css")"
rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)
和AnotherView有一个局部视图(AnotherPartial)需要:
<link href="@Url.Content("~/Content/themes/base/AnotherPartial.css")"
rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)
问题:我们如何将这些CSS文件链接添加到Layouthead和AnotherPartial链接到Layout头?
RenderSection不是一个好主意,因为AnotherPage可以有多个Partials.添加所有CSS到头部是没用的,因为它将动态更改(它取决于Anotherpages).