Dunno如果在PR或Beta中发生这种情况,但如果我创建了一个扩展方法HtmlHelper,则在Razor驱动的页面中无法识别:
namespace SomeNamespace.Extensions {
public static class HtmlExtensions {
public static string Foo(this HtmlHelper html) {
return "Foo";
}
}
}
Run Code Online (Sandbox Code Playgroud)
我把它添加到以下<Namespaces>部分Web.config:
<pages>
<namespaces>
<add namespace="System.Web.Mvc" />
<!-- snip -->
<add namespace="SomeNamespace.Extensions"/>
</namespaces>
</pages>
Run Code Online (Sandbox Code Playgroud)
但是在尝试查看页面时会抛出编译错误:
@Html.Foo()
Run Code Online (Sandbox Code Playgroud)
如果我使用WebForms重新创建页面,它可以正常工作.这是怎么回事?
解决方法
如果我@using SomeNamespace.Extensions在我的Razor视图中包含它,那么它可以工作,但我更愿意将它包含在内Web.config
我有一个类似的模型:
public class SampleModel
{
public Product Product { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我尝试打印出异常
@Html.TextBoxFor(p => p.Product.Name)
Run Code Online (Sandbox Code Playgroud)
这是错误:
Exception: An expression tree may not contain a dynamic operation
Run Code Online (Sandbox Code Playgroud)
如果有人能给我一些如何解决这个问题的线索我真的很感激!
我对如何混合剃刀和js很困惑.这是我坚持的当前功能:
<script type="text/javascript">
var data = [];
@foreach (var r in Model.rows)
{
data.push([ @r.UnixTime * 1000, @r.Value ]);
}
Run Code Online (Sandbox Code Playgroud)
如果我可以声明c#代码<c#></c#>而其他一切都是JS代码 - 这就是我所追求的:
<script type="text/javascript">
var data = [];
<c#>@foreach (var r in Model.rows) {</c#>
data.push([ <c#>@r.UnixTime</c#> * 1000, <c#>@r.Value</c#> ]);
<c#>}</c#>
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最佳方法是什么?
为什么默认情况下在添加新的"编辑"视图时会更改这些内容?使用EditorFor()vs.有什么好处TextboxFor()?
我找到了这个
默认情况下,Create和Edit脚手架现在使用Html.EditorFor助手而不是Html.TextBoxFor助手.当"添加视图"对话框生成视图时,这会以数据注释属性的形式改进对模型元数据的支持.
我正在使用_viewstart.cshtml自动为我的视图分配相同的Razor布局.
它是我的Views文件夹根目录中的一个死的简单文件,如下所示:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)
这比将@Layout指令添加到每个视图更干.
但是,这对Razor 局部视图造成了问题,因为它们运行_viewstart.cshtml的内容,因此错误地为自己分配了一个布局,这使得它们不再是局部的.
这是一个假设项目,显示_viewstart.cshtml文件,共享_layout.shtml文件和部分视图("AnonBar.cshtml").
目前,我解决这个问题的方法是在每个局部视图中添加以下行:
@{
Layout = "";
}
Run Code Online (Sandbox Code Playgroud)
这似乎是在Razor中将视图表示为部分视图的错误方式.(请注意,与Web窗体视图引擎不同,部分视图的文件扩展名相同.)
我考虑的其他选项,但更糟糕的是:
这是Razor视图引擎团队仍在充实的东西,还是我错过了一个基本概念?
我收到以下错误:
'object'不包含'RatingName'的定义
当您查看匿名动态类型时,它显然具有RatingName.

我意识到我可以用元组做到这一点,但我想理解为什么会出现错误信息.
我正在学习渐进式增强功能,我对AJAXifying视图有疑问.在我的MVC 3项目中,我有一个布局页面,一个viewstart页面和两个普通视图.
viewstart页面位于Views文件夹的根目录中,因此适用于所有视图.它指定所有视图都应该_Layout.cshtml用于其布局页面.布局页面包含两个导航链接,每个视图一个.链接用于@Html.ActionLink()将自己呈现给页面.
现在我添加了jQuery并希望劫持这些链接并使用Ajax动态加载页面上的内容.
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
Run Code Online (Sandbox Code Playgroud)
我可以通过两种方式来做到这一点,但我并不特别喜欢这两种方式:
1)我可以获取整个View的内容并将它们放在局部视图中,然后让主视图在渲染时调用局部视图.这样,Request.IsAjaxRequest()在控制器中使用,我可以根据请求是否是Ajax请求返回View()或返回PartialView().我无法将常规视图返回到Ajax请求,因为它将使用布局页面,我将获得注入的布局页面的第二个副本.但是,我不喜欢这个,因为它迫使我创建空视图,其中只有一个@{Html.RenderPartial();}用于标准GET请求.
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Run Code Online (Sandbox Code Playgroud)
然后在Index.cshtml中执行以下操作:
@{Html.RenderPartial("partialView");}
Run Code Online (Sandbox Code Playgroud)
2)我可以从_viewstart中删除布局指定,并在请求不是Ajax时手动指定它:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Razor将对象作为JSON编写到我的Asp.Net MVC View中,如下所示:
<script type="text/javascript">
var potentialAttendees = @Json.Encode(Model.PotentialAttendees);
</script>
Run Code Online (Sandbox Code Playgroud)
问题是在输出中JSON被编码,我的浏览器不喜欢它.例如:
<script type="text/javascript">
var potentialAttendees = [{"Name":"Samuel Jack"},];
</script>
Run Code Online (Sandbox Code Playgroud)
如何让Razor发出未编码的JSON?
我正在使用新的Razore视图引擎更新旧的.aspx视图.我有很多地方,我有这样的代码:
<span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span>
Run Code Online (Sandbox Code Playgroud)
理想情况下我想这样做:
<span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}">Vote Up</span>
Run Code Online (Sandbox Code Playgroud)
但是这里有两个问题:
vote-up@{puzzle.UserVote ....不会将@符号视为代码块的开头@puzzle.UserVote == VoteType.Up查看第一部分@puzzle.UserVote,好像它应该呈现变量的值.有谁知道如何解决这些问题?
我需要使用某种魔法来获取pages/namespaceswebconfig中元素的名称空间吗?
<pages>
<namespaces>
<add namespace="System.Web.Mvc"/>
<add namespace="System.Web.Mvc.Ajax"/>
<add namespace="System.Web.Mvc.Html"/>
<add namespace="System.Web.Routing"/>
<add namespace="System.Web.WebPages"/>
<add namespace="System.Web.Helpers"/>
<add namespace="MyCustomHelpers"/>
</namespaces>
</pages>
Run Code Online (Sandbox Code Playgroud)
以上只是不想要的工作.我知道命名空间很好,因为当我把它@using MyCustomHelpers放在页面的顶部时它神奇地起作用.
这样我就可以在Html.SomeFunction()不必将@using所有页面放在首位的情况下开始工作
razor ×10
asp.net-mvc ×5
c# ×2
.net-4.0 ×1
asp.net ×1
dynamic ×1
html-helper ×1
javascript ×1
json ×1
master-pages ×1
syntax ×1