ASP.NET MVC从Preview 5升级到Beta期间的问题?

时间:2008-10-16 13:07:35

标签: asp.net-mvc refactoring

从ASP.NET MVC Preview 5升级到新发布的Beta版本时,您需要做什么问题或重构?

19 个答案:

答案 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)

我自己即将这样做。以下是自述文件中的更改列表:

在CodePlex Preview 5和Beta之间进行的更改

  • 将默认验证消息更改为更加最终用户友好。
  • 将CompositeViewEngine重命名为AutoViewEngine。
  • 向UrlHelper类型的Controller添加了Url属性。这样可以方便地从控制器中生成基于路由的URL。
  • 添加了ActionNameSelectorAttribute抽象基类,该基类用作ActionNameAttribute的基类型。通过继承此基本属性类,您可以创建参与按名称选择操作的自定义属性。
  • 为IViewEngine添加了一个新的ReleaseView方法,允许在视图完成呈现时通知自定义视图引擎。这对于清理或视图池方案很有用。
  • 将ControllerBuilder方法DisposeController重命名为ReleaseController,以适应为视图引擎建立的模式。
  • 删除了HtmlHelper类中的大多数方法,将它们转换为HtmlHelper类的扩展方法。这些方法存在于新的命名空间(System.Web.Mvc.Html)中。如果要从Preview 5迁移,则必须将以下元素添加到Web.config文件的名称空间部分: <add namespace="System.Web.Mvc.Html"/> 这使您可以用自己的方法完全替换我们的辅助方法。
  • 更改了默认模型绑定器(DefaultModelBinder)以处理复杂类型。 IModelBinder接口也已更改为接受ModelBindingContext类型的单个参数。
  • 添加了一个新的HttpVerbs枚举,其中包含最常用的HTTP谓词(GET,POST,PUT,DELETE,HEAD)。还为接受枚举的AcceptVerbsAttribute添加了构造函数重载。枚举值可以组合。因为可以响应枚举中未包含的HTTP谓词,所以AcceptVerbsAttribute保留接受字符串数组作为参数的构造函数。例如,以下代码段显示了一个可以响应POST和PUT请求的操作方法。

    [AcceptVerbs(HttpVerbs.Post | HttpVerbs.Put)]  
    public ActionResult Update() {...
    }
    
  • 修改了RadioButton帮助器方法,以确保每个重载都接受一个值。由于单选按钮用于指定一组可能值的选项,因此需要指定单选按钮的值。

  • 对默认项目模板进行了修改和修复。这包括将脚本文件移动到新的Scripts文件夹。默认模板使用ModelState类来报告验证错误。
  • 更改了操作方法选择。如果两个操作方法与请求匹配,但只有一个具有从与请求匹配的ActionMethodSelectorAttribute派生的属性,则会调用该操作。在早期版本中,此方案导致异常。 例如,以下两个操作方法位于同一个控制器中:

    public ActionResult Edit() {  
      //...  
    }  
    
    [AcceptVerbs(HttpVerbs.Post)]  
    public ActionResult Edit(FormCollection form) {  
      //...
    }
    

在预览5中,对Edit操作的POST请求将导致异常,因为两个方法匹配请求。在Beta中,优先级是通过AcceptVerb属性匹配当前请求的方法。在此示例中,第一个方法将处理Edit操作的任何非POST请求。

  • 为ViewDataDictionary.Eval方法添加了一个接受格式字符串的重载。
  • 从ViewContext类中删除了ViewName属性。
  • 为值提供程序添加了IValueProvider接口,以及默认实现DefaultValueProvider。值提供程序提供绑定到模型对象时模型绑定程序使用的值。已更新Controller类的UpdateModel方法,以允许您指定自定义值提供程序。

答案 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。