从ASP.NET MVC Preview 5升级到新发布的Beta版本时,您需要做什么问题或重构?
答案 0 :(得分:11)
第一个问题:死亡的黄色屏幕
CS0234: The type or namespace name 'Mvc' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)
解决方案:我删除了项目中的所有引用并重新添加它们,指向程序文件\ asp.net \ asp.net mvc beta \ assemblies中的程序集,但这并没有解决问题。
我在gac中有一个system.web.mvc dll(不知道怎么做)。试图删除它。无法;一个或多个应用程序需要组装。必须按照here所述找到程序集并删除注册表项。然后我就可以删除gac版本的system.web.mvc。
此STILL无法解决问题。我不得不重新添加引用AGAIN。现在它的工作。
只是要明确!!! 测试版程序集已删除在Program Files下,而旧版本的System.Web.Mvc则在GAC中。
答案 1 :(得分:6)
我自己即将这样做。以下是自述文件中的更改列表:
<add namespace="System.Web.Mvc.Html"/>
这使您可以用自己的方法完全替换我们的辅助方法。 添加了一个新的HttpVerbs枚举,其中包含最常用的HTTP谓词(GET,POST,PUT,DELETE,HEAD)。还为接受枚举的AcceptVerbsAttribute添加了构造函数重载。枚举值可以组合。因为可以响应枚举中未包含的HTTP谓词,所以AcceptVerbsAttribute保留接受字符串数组作为参数的构造函数。例如,以下代码段显示了一个可以响应POST和PUT请求的操作方法。
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Put)]
public ActionResult Update() {...
}
修改了RadioButton帮助器方法,以确保每个重载都接受一个值。由于单选按钮用于指定一组可能值的选项,因此需要指定单选按钮的值。
更改了操作方法选择。如果两个操作方法与请求匹配,但只有一个具有从与请求匹配的ActionMethodSelectorAttribute派生的属性,则会调用该操作。在早期版本中,此方案导致异常。 例如,以下两个操作方法位于同一个控制器中:
public ActionResult Edit() {
//...
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection form) {
//...
}
在预览5中,对Edit操作的POST请求将导致异常,因为两个方法匹配请求。在Beta中,优先级是通过AcceptVerb属性匹配当前请求的方法。在此示例中,第一个方法将处理Edit操作的任何非POST请求。
答案 2 :(得分:5)
我遇到了与Will相同的问题,并且必须做与他类似的事情,包括将dll复制到bin文件夹。
现在内部vs.net服务器正在运行,但导致IIS7崩溃。
好吧,事实证明我遇到的一个主要问题是错过了更新web.config中的编译程序集的步骤:
<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
答案 3 :(得分:4)
我所要做的就是从
更新程序集%ProgramFiles%\ Microsoft ASP.NET \ ASP.NET MVC Beta
同时从codeplex
获取最新的Microsoft.Web.MVC也要更新我的期货装配。
将2行添加到web.config
这一部分到<assemblies>
部分:
<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
此<namespaces>
部分:
<add namespace="System.Web.Mvc.Html"/>
然后我必须将所有<%using (Html.Form())
更新为<%using (Html.BeginForm())
在一个代码文件中,我必须添加System.Web.Mvc.Html;
命名空间
我的东西是基于Rob Conery的MVC Storefront,所以任何使用它的人都应该能够遵循上述内容。
希望它可以帮助那些人。
答案 4 :(得分:2)
忽略这一点......我是一个失败者 - 它是程序文件中的Microsoft ASP.net ......而不仅仅是ASP.net
也许这应该是第二个问题,但我认为将它们全部放在一个地方可能有所帮助。
运行Beta安装程序时,我的电脑上没有任何更改。我没有看到Program Files文件夹中的文件夹...没有任何程序集添加到GAC ......即使安装程序进入最后一步,然后挂起大约10分钟左右。
我已经卸载并重新安装了几次而没有任何运气。
有类似问题的人吗?
答案 5 :(得分:2)
我试图找出新的ModelBinder是如何工作的,据我所知它是非常不同的,但我还没有找到它是如何工作的..
我的老人看起来像:
public class GuestbookEntryBinder : IModelBinder
{
#region IModelBinder Members
public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState)
{
if (modelType == typeof(GuestbookEntry))
{
return new GuestbookEntry
{
Name = controllerContext.HttpContext.Request.Form["name"] ?? "",
Website = controllerContext.HttpContext.Request.Form["website"] ?? "",
Message = controllerContext.HttpContext.Request.Form["message"] ?? "",
};
}
return null;
}
#endregion
}
新的看起来像:
#region IModelBinder Members
public ModelBinderResult BindModel(ModelBindingContext bindingContext)
{
throw new NotImplementedException();
}
#endregion
任何提示?
答案 6 :(得分:2)
AutoFac的问题现已在AutoFac代码库的修订版454中得到解决 http://code.google.com/p/autofac/issues/detail?id=86&can=1
答案 7 :(得分:1)
当我从Preview 5升级到Beta时,我很难找到ActionLink的泛型重载。看来这些不包含在ASP.NET MVC的主要版本中,而是作为“期货”发布。
我找到了必要的程序集(Microsoft.Web.Mvc)@ http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=aspnet&ReleaseId=18459
答案 8 :(得分:1)
现在已经破了:
<%=Html.TextBox("Name", new Hash(@class => "required"))%>
在预览5中,上面会将ViewData.Model.Name的值绑定到文本框。这仍然有效:
<%=Html.TextBox("Name")%>
但是如果要指定html属性,还必须按如下方式指定值:
<%=Html.TextBox("Name", ViewData.Model.Name, new Hash(@class => "required"))%>
实际上这不太安全。如果ViewData.Model可能为null,则需要执行以下操作:
<%=Html.TextBox("Name", ViewData.Model == null ? null : ViewData.Model.Name, new Hash(@class => "required"))%>
此更改似乎与Beta版本说明相反:
“......为了减少过载 模糊...值参数已更改 从几个对象到另一个字符串 辅助方法。“
TextBox的value参数曾经是字符串,并且已更改为object。因此,为了避免歧义,他们必须删除我最常使用的一个重载。 :(
恕我直言,每个HTML帮助器方法都应该有重载,允许在所有情况下绑定而不指定值。否则,我们最终会得到不一致的视图代码,这会混淆未来的开发者。
答案 9 :(得分:1)
ViewContext构造函数发生了重大变化。它改变了:
ViewContext(ControllerContext context,string viewName,ViewDataDictionary viewData,TempDataDictionary tempData)
为:
ViewContext(ControllerContext context,IView view,ViewDataDictionary viewData,TempDataDictionary tempData)
这破坏了我的代码,因为我使用的是MvcContrib.Services.IEmailTemplateService,它在其RenderMessage方法中采用了ViewContext。要从模板名称获取IView,我将执行以下操作:
var view = ViewEngines.DefaultEngine.FindView(controllerContext,viewName,null);
不确定这是否是最佳做法,但似乎有效。
答案 10 :(得分:1)
关于Autofac问题。 autofac讨论组中有一个关于需要更新控制器工厂以与MVC框架的Beta版本兼容的线程
http://groups.google.com/group/autofac/browse_thread/thread/68aaf55581392d08
我希望他们很快发布新版本: - )
答案 11 :(得分:1)
Html.TextBox - 值现在是对象,而不是字符串。 因此,隐藏错误可能(不是在编译时,甚至不是在运行时),例如我之前使用过这个重载方法Html.TextBox(字符串名称,对象htmlAttributes)。现在我的attrs进入了文本框值。
答案 12 :(得分:1)
在一天的大部分时间里都在努力解决这个问题,我想我会在这里发布我的解决方案。也许这是正常的Visual Studio行为,但我之前从未注意到它......
在我现有的项目中,我实际上必须手动将Beta文件移动到Bin文件夹。无论出于何种原因,只需使用“添加参考”浏览它就不起作用了......
答案 13 :(得分:1)
是的,也使用Autofac作为DI容器。
和这个人一样得到同样的问题
http://groups.google.com/group/autofac/browse_thread/thread/68aaf55581392d08
不知道是否可以修复,但在修复之前无法继续修复......
答案 14 :(得分:1)
我使用Autofac作为我的DI容器。尝试处理容器对象时会抛出空容器异常。
答案 15 :(得分:0)
如果您使用期货装配(Microsoft.Web.Mvc)中的Html.Form,您可能会在FormMethod枚举上遇到名称冲突。例如:
Html.Form<FooController>(c => c.Bar(), FormMethod.Post, new Hash(@class => "foobar"))
这会抱怨FormMethod是Microsoft.Web.Mvc和System.Web.Mvc之间的模糊引用。这非常令人难过,因为IMHO BeginForm没有提供可行的选项,因为它缺少使用lambda表达式的覆盖。你唯一的选择是使用魔法字符串,它可以抵抗重构。
似乎最好的解决方案是将以下内容放入使用FormMethod的每个视图中:
<%@ Import Namespace="FormMethod=Microsoft.Web.Mvc.FormMethod"%>
唉。希望这是暂时的。我希望可以将期货装配更改为使用System.Web.Mvc中的枚举。或者好多了,希望他们重载BeginForm来使用表达式。
答案 16 :(得分:0)
似乎Html.Image已被破坏。 As of preview 5 it was moved to the futures assembly.我无法想象为什么。无论如何,错误是:
Method not found: 'Void System.Web.Mvc.UrlHelper..ctor(System.Web.Mvc.ViewContext)'
我能看到的最佳解决方案是替换它:
<%=Html.Image("~/Content/Images/logo.jpg") %>
用这个:
<img src="<%=Html.ResolveUrl("~/Content/Images/logo_350.jpg")%>" />
答案 17 :(得分:0)
上面会说的是,除了从GAC删除程序集并重新添加引用之外我还必须再次运行Beta安装程序(这次将正确的程序集放在GAC中,尽管我只是使用文件参考)。
我怀疑如果我在运行安装程序之前从GAC中删除了预览5程序集(我也不知道它们是如何进入的),一切都可能没问题。值得一试。
在不太可能的事件中,其他任何人都像我一样愚蠢并在Vista上工作,您可能不需要执行上面的注册表黑客攻击以删除旧程序集 - 只需运行gacutil从管理员命令提示符。卫生署!
答案 18 :(得分:0)
我发现使用空白项目中的命名空间更新web.config名称空间元素可以解决我的问题。由于界面更改,我还必须更新我的ModelBinders。