代码之家  ›  专栏  ›  技术社区  ›  Elijah Manor

ASP.NET MVC从预览版5升级到测试版时出现问题?

  •  9
  • Elijah Manor  · 技术社区  · 17 年前

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

    19 回复  |  直到 10 年前
        1
  •  6
  •   Jason Plank Maksim Kondratyuk    14 年前

    我就要自己动手了。以下是自述文件中的更改列表:

    在CodePlex预览5和测试版之间所做的更改

    • 已将默认验证消息更改为更便于最终用户使用。
    • 已将compositeviewengine重命名为autoviewengine。
    • 向UrlHelper类型的控制器添加了URL属性。这使得从控制器内生成基于路由的URL变得方便。
    • 添加了actionnameselectorattribute抽象基类,该类用作actionnameattribute的基类型。通过从此基本属性类继承,可以创建按名称参与操作选择的自定义属性。
    • 向IViewEngine添加了一个新的ReleaseView方法,该方法允许在视图渲染完成时通知自定义视图引擎。这对于清理或查看池场景很有用。
    • 已将ControllerBuilder方法DisposeController重命名为ReleaseController,以适应为视图引擎建立的模式。
    • 删除了htmlhelper类上的大多数方法,将它们转换为htmlhelper类的扩展方法。这些方法存在于新的命名空间(system.web.mvc.html)中。如果要从预览5迁移,则必须将以下元素添加到web.config文件的namespaces部分: <add namespace="System.Web.Mvc.Html"/> 这使得您可以用自己的方法完全替换我们的助手方法。
    • 已更改默认模型绑定器(DefaultModelBinder)以处理复杂类型。IModelBinder接口也已更改为接受ModelBindingContext类型的单个参数。
    • 添加了一个新的http verbs枚举,该枚举包含最常用的http谓词(get、post、put、delete、head)。还向接受枚举的AcceptVerbSattribute添加了构造函数重载。枚举值可以组合。由于可以对枚举中未包含的HTTP谓词作出响应,因此AcceptVerbsattribute保留接受字符串数组作为参数的构造函数。例如,下面的代码片段显示了一个可以响应POST和PUT请求的操作方法。

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

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

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

    在预览5中,编辑操作的post请求将导致异常,因为有两个方法匹配该请求。在beta中,通过acceptVerb属性将优先权授予与当前请求匹配的方法。在本例中,第一个方法将处理编辑操作的任何非Post请求。

    • 为接受格式字符串的viewDataDictionary.eval方法添加了重载。
    • 已从ViewContext类中移除ViewName属性。
    • 为值提供程序添加了一个ivalueprovider接口,以及默认实现defaultValueProvider。值提供者提供绑定到模型对象时模型绑定器使用的值。已更新控制器类的updateModel方法,以允许您指定自定义值提供程序。
        2
  •  11
  •   Will    17 年前

    第一期:死亡黄屏。
    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\assembly中的程序集,但这并没有解决问题。

    我在GAC中有一个system.web.mvc dll(不知道怎么做)。试图删除它。无法;一个或多个应用程序需要程序集。必须找到所描述的组件 here 并删除注册表项。然后我可以删除gac的system.web.mvc版本。

    这仍然没有解决问题。我必须重新添加引用。现在开始工作了。


    只是说清楚!!!! 测试版程序集被放到程序文件下,而旧版本的system.web.mvc在GAC中。


        3
  •  5
  •   Community Mohan Dere    9 年前

    我遇到的问题和 Will 并且必须像他一样做类似的事情,包括将DLL复制到bin文件夹中。

    现在,内部vs.net服务器正在工作,但导致iis7崩溃。

    好吧,结果发现一个主要问题是我错过了 更新web.config中的编译程序集 :

    <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    
        4
  •  4
  •   CraftyFella    17 年前

    我只需要更新程序集

    %ProgramFiles%\Microsoft ASP.NET\ASP.NET MVC测试版

    还可以从中获取最新的microsoft.web.mvc codeplex

    也要更新我的Futures程序集。

    在web.config中添加2行

    这一个给 <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; 命名空间

    我的东西是罗布·科内里的 MVC Storefront ,所以任何使用它的人都应该能够遵循上面的步骤。

    希望它能帮助别人。

        5
  •  2
  •   hugoware    17 年前

    忽略这一点…我是个失败者-是程序文件中的Microsoft ASP.NET…不仅仅是ASP.NET

    也许这应该是第二个问题,但我认为把这一切放在一个地方可能会有所帮助。

    当运行测试版安装程序时,我的电脑没有任何变化。我看不到程序文件文件夹中的文件夹…没有程序集添加到GAC…甚至安装程序也会进入最后一步,然后挂起大约10分钟。

    我已经卸载并重新安装了几次,但没有任何运气。

    有人有类似的问题吗?

        6
  •  2
  •   TheCodeJunkie    17 年前

    自动空调的问题现在已经在自动空调代码库的第454版中解决了。 http://code.google.com/p/autofac/issues/detail?id=86&can=1

        7
  •  2
  •   Søren Pedersen    17 年前

    我试图找出新的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
    

    有什么暗示吗?

        8
  •  1
  •   Korbin    17 年前

    我使用autopac作为DI容器。尝试释放容器对象时引发空容器异常。

        9
  •  1
  •   Andy    17 年前

    是的,也可以使用autofac作为DI容器。

    和这个家伙有同样的问题

    http://groups.google.com/group/autofac/browse_thread/thread/68aaf55581392d08

    不知道是否可以修复,但在修复之前无法继续……

        10
  •  1
  •   hugoware    17 年前

    在这一天的大部分时间里,我都在挣扎,我想我会把我的解决方案贴在这里。也许这是正常的Visual Studio行为,但我以前从未注意到…

    在我现有的项目中,我实际上不得不手动将beta文件移到bin文件夹中。不管是什么原因,仅仅通过添加引用浏览它是不起作用的…

        11
  •  1
  •   derigel    17 年前

    html.textbox-值现在是对象,而不是字符串。 因此,隐藏错误是可能的(不是在编译时,甚至不是在运行时),例如,我以前使用过这种重载方法html.textbox(字符串名称,对象htmlattributes)。现在我的属性进入文本框值。

        12
  •  1
  •   TheCodeJunkie    17 年前

    关于自动空调的问题。autopac讨论组中有一个线程,讨论需要更新控制器工厂以与MVC框架的beta版本兼容。

    http://groups.google.com/group/autofac/browse_thread/thread/68aaf55581392d08

    我希望他们很快就会发布一个新版本——)

        13
  •  1
  •   Jason Whitehorn    17 年前

    当我从预览版5升级到测试版时,我很难找到ActionLink的一般重载。这些似乎不包括在ASP.NET MVC的主要版本中,但作为“期货”发货。

    我找到了必要的程序集(microsoft.web.mvc)@ http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=aspnet&ReleaseId=18459

        14
  •  1
  •   Tim Scott    17 年前

    在ViewContext构造函数中有一个中断性更改。它已经从:

    viewContext(controllerContext Context、String viewName、viewDataDictionary viewData、tempDataDictionary tempData)

    到:

    viewContext(ControllerContext Context、iView View、viewDataDictionary viewData、tempDataDictionary tempData)

    这破坏了我的代码,因为我使用的是mvcontrib.services.iemailTemplateService,它在renderMessage方法中采用了一个viewContext。要从模板名称获取iView,我将执行以下操作:

    var view=viewengines.defaultengine.findview(controllerContext,viewName,空);

    不确定这是否是最佳实践,但似乎有效。

        15
  •  1
  •   Tim Scott    17 年前

    现在已损坏:

    <%=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可能为空,则需要执行以下操作:

    <%=Html.TextBox("Name", ViewData.Model == null ? null : ViewData.Model.Name, new Hash(@class => "required"))%>
    

    这一变化似乎与beta发行说明相反:

    “…以减少过载 歧义…值参数已更改 从对象到字符串 帮助程序方法。”

    文本框的值参数以前是字符串,已更改为对象。为了避免模棱两可,他们必须消除我使用最多的一个超负荷。:(

    imho,每个HTML助手方法都应该有允许在所有情况下绑定而不指定值的重载。否则,我们将以不一致的视图代码结束,这将混淆未来的devs。

        16
  •  0
  •   Tim Scott    17 年前

    如果使用预购程序集(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 begininform不提供可行的选项,因为它缺少使用lambda表达式的重写。您唯一的选择是使用魔法字符串,它拒绝重构。

    似乎,最佳解决方案是将以下内容放入使用FormMethod的每个视图中:

    <%@ Import Namespace="FormMethod=Microsoft.Web.Mvc.FormMethod"%>
    

    呃。希望这是暂时的。我希望Futures程序集可以更改为使用system.web.mvc中的枚举。或者更好的是,希望它们重载begininform以使用表达式。

        17
  •  0
  •   Community Mohan Dere    9 年前

    似乎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")%>" />
    
        18
  •  0
  •   alexis.kennedy    17 年前

    上面将要说的,除了从GAC中删除程序集并重新添加引用之外,我还必须再次运行beta安装程序(这次将正确的程序集放入GAC中,尽管我只是使用一个文件引用)。

    我怀疑如果我在运行安装程序之前从GAC中删除了Preview 5程序集(我也不知道它们是如何进入的),那么一切都可能正常。值得尝试。

    不可能的 如果其他人和我一样蠢,在Vista上工作,你可能不需要做上面的注册表黑客,以便删除旧程序集-只需从管理命令提示符运行gacutil。呸!

        19
  •  0
  •   Mr. Kraus    17 年前

    我发现用空白项目中的名称空间更新web.config namespaces元素修复了我的问题。由于接口更改,我还必须更新我的模型绑定器。