我刚刚创建了一个ASP.NET MVC 4项目,并使用Visual Studio 2012 RC创建了一个Controller和Razor Views for Index
和Create
Actions.
当我来运行应用程序并浏览到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中,我仍然无法使用!
解决方案如下.
我不知道如何关闭它,因为最终更新似乎解决了这个问题.我仔细检查了我使用新项目执行了干净安装.但是,我所做的同样失败的项目现在可以在各种更新后进行,并且没有人工明显的干预.感谢所有的想法,但当时肯定存在问题;)
我已经重写了Entity Framework 4.1 DbContext类中的SaveChanges()方法.
我的覆盖如下:
public override int SaveChanges() {
IEnumerable<DbEntityEntry> modifiedEntityEntries = ChangeTracker.Entries().Where( e => e.State == EntityState.Modified );
Debug.Assert( modifiedEntityEntries.Count() == 2 );
int savedChanges = base.SaveChanges();
Debug.Assert( savedChanges == 1 );
// HELP! At this point, how do I tell Which of the two "Modified" entities actually updated a row in the database?
return savedChanges;
}
Run Code Online (Sandbox Code Playgroud)
假设上下文中有2个实体,并且都标记为Modified(EntityState.Modified).其中一个已被修改,并且与底层数据库行不同.另一个实际上与底层数据库行不同,它只是标记为这样.
在调用SaveChanges()后,我如何判断这两个实体中哪一个实际更新了数据库中的一行,哪一个实际上没有真正修改过?
我已经阅读了大约30个Stack Overflow问题,以及大约20个博客,但找不到我的答案.那就是说,我确信我要求的答案就在那里,所以如果你知道它,请指出(请注意关于不符合我要求的答案的最后一段/句子).谢谢!
我坚持类似于以下类的类的实例:
public class Data {
public int Id { get; set; }
}
public class Container {
public int Id { get; set; }
public Data Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
目前编写查询是为了通过抽象层查找容器,该抽象层要求Lambda Expression接受Container并返回bool(谓词).即使Entity Framework 5是首选的ORM,它也不会接受IQueryable.
我的任务是提供一个基于Lambda表达式的API表面,它接受数据类型.我无法更改抽象层(我必须传递一个接受Container的谓词)所以我试图将我收到的表达式转换为:
Expression<Func<Data , bool>>
to:
Expression<Func<Container , bool>>
Run Code Online (Sandbox Code Playgroud)
我在我的存储库类中添加了一个额外的方法,如下所示:
public Container Find( Expression<Func<Data , bool>> predicate ) {
IEnumerable<Container> result = QueryStrategy.Fetch( c => predicate.Compile().Invoke( c.Data ) );
return result.FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
这补充了现有的Find方法:
public Container Find( Expression<Func<Container , bool>> predicate ) {
IEnumerable<Container> …
Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET MVC 3应用程序,并使用Ninject将依赖项注入我的类.
控制器上的操作将ViewModel(不包含逻辑)传递给视图层.
当HTTP表单被POST时,MVC 3创建一个ViewModel实例并将传入的POST数据绑定到ViewModel的属性.MVC 3使用名为DefaultModelBinder的类来创建实例并执行绑定.
我的大多数ViewModel都共享一个依赖项,我并不想从每个单独的Controller方法(DRY原则)中设置它.
因此,我创建了一个DefaultModelBinder的自定义子类,如下所示:
using System;
using System.Web.Mvc;
namespace Application.Classes {
public sealed class CustomModelBinder : DefaultModelBinder {
private readonly IDependencyResolver DependencyResolver;
public CustomModelBinder( IDependencyResolver dependencyResolver ) {
DependencyResolver = dependencyResolver;
}
protected override object CreateModel( ControllerContext controllerContext , ModelBindingContext modelBindingContext , Type modelType ) {
return DependencyResolver.GetService( modelType );
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已将其设置为替换DefaultModelBinder,如下所示(在Global.asax.cs中):
protected void Application_Start() {
// ...
ModelBinders.Binders.DefaultBinder = new CustomModelBinder( DependencyResolver.Current );
// ...
}
Run Code Online (Sandbox Code Playgroud)
通过在Controller方法接收ViewModel时执行此操作,它将是由Ninject使用我在NinjectModule中指定的绑定构建的.ViewModel现在接收注入其构造函数的依赖项.
这是否适合使用服务定位器模式?
澄清/更新:
我有一些方法对我的实体的数据执行标准过滤(使用Entity Framework v4).
示例#1:
protected IQueryable<Database.Product> GetActiveProducts( ObjectSet<Database.Product> products ) {
var allowedStates = new string[] { "Active" , "Pending" };
return (
from product in products
where allowedStates.Contains( product.State )
&& product.Hidden == "No"
select product
);
}
Run Code Online (Sandbox Code Playgroud)
示例#2:
protected IQueryable<Database.Customer> GetActiveProducts( ObjectSet<Database.Customer> customers ) {
var allowedStates = new string[] { "Active" , "Pending" };
return (
from customer in customers
where allowedStates.Contains( customer.State )
&& customer.Hidden == "No"
select customer
);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,这些方法与它们运行的实体类型完全相同.我有超过10种这样的方法,一种用于我系统中的每种类型的实体.
我试图理解我如何能够在任何实体类型中传递1个单一方法,并且如果存在2个字段/属性,则让它执行where子句.
我不在数据库中使用继承,因此就系统而言,每个实体类型都有"隐藏"和"状态"字段是巧合.
我的谷歌搜索告诉我它与使用Expression.Call()构建代码有关,但我的头现在正在旋转!
如果我理解正确的话,以下是通用类型:
class Example<T> {}
Run Code Online (Sandbox Code Playgroud)
以下是具体参数化类型:
Example<String>
Run Code Online (Sandbox Code Playgroud)
以下不是具体参数化类型:
Example<? extends Number>
Run Code Online (Sandbox Code Playgroud)
鉴于以下内容,有人可以向我解释 Example 是否是具体参数化类型?
Example< OtherExample<? extends Number> >
Run Code Online (Sandbox Code Playgroud)
如果它不是具体的,那么是否可以说如果类型参数本身是通配符,或者任何嵌套类型参数是通配符,那么最外层的类型因此不是具体的?
更新
我现在意识到术语“具体参数化类型”可能不是官方的 Java 术语。
我从以下来源获取它:http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#Topic2
结论
我被说服了:
Example< OtherExample<? extends Number> >
Run Code Online (Sandbox Code Playgroud)
是具体参数化类型(就 GenericsFAQ 的术语而言),因为它不直接包含通配符(“?”),并且可以与“new”关键字一起使用。
谢谢!
c# ×4
asp.net-mvc ×1
dbcontext ×1
java ×1
lambda ×1
linq ×1
ninject ×1
razor ×1
savechanges ×1