View中的T4MVC ArgumentOutOfRangeException

时间:2012-12-19 08:38:11

标签: razor asp.net-mvc-4 t4mvc

我刚刚在我的项目中安装了T4MVC,但我遇到了一些问题。

在我的控制器中,我可以毫无问题地调用重定向到操作:

  return RedirectToAction(Actions.Index());

如果我从我的视图中调用它,我会得到一个ArgumentOutOfRangeException。

@Html.ActionLink("Delete Dinner", MVC.Home.Index())

为了确保我做得正确,我创建了一个新的MVC解决方案,该线路正常工作。 我从我的HomeController中删除了我的'baseController'继承并重新绑定了T4MVC以确保它不会干扰。 我不知道哪里开始寻找这个,调试对我没有帮助,因为它似乎在扩展方法中探讨:

[ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index]
   System.ThrowHelper.ThrowArgumentOutOfRangeException() +72
   System.Collections.ObjectModel.Collection`1.set_Item(Int32 index, T value) +10419142
   System.Web.Mvc.ControllerContext.get_RequestContext() +25
   System.Web.Mvc.Html.LinkExtensions.RouteLink(HtmlHelper htmlHelper, String linkText, String routeName, String protocol, String hostName, String fragment, RouteValueDictionary routeValues, IDictionary`2 htmlAttributes) +47
   System.Web.Mvc.T4Extensions.ActionLink(HtmlHelper htmlHelper, String linkText, ActionResult result, IDictionary`2 htmlAttributes, String protocol, String hostName, String fragment) +196
   System.Web.Mvc.T4Extensions.ActionLink(HtmlHelper htmlHelper, String linkText, ActionResult result) +72
   ASP._Page_Views_Home_Index_cshtml.Execute() in c:\Thva\Misc\DropBox\Work\MyProjects\Wims\Wims.Website\Views\Home\Index.cshtml:53

有什么想法吗? 提前致谢

修改:我刚试过这个但它仍然不起作用: 创建一个新的控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Wims.Website.Controllers
{
    public partial class MyTestController : Controller
    {
        //
        // GET: /MyTest/

        public virtual ActionResult Index()
        {
            return View();
        }

    }
}

运行AutoT4MVC, 查看:

@{
    ViewBag.Title = "Index";
}
@Html.ActionLink("aiaieiae", MVC.MyTest.Index())
<h2>Index</h2>

为了确保我没有依赖性,如果我调用我的页面它仍然不起作用:

http://localhost:2303/MyTest/index

4 个答案:

答案 0 :(得分:3)

我有同样的问题。然后我在构建日志中发现了以下警告:

> Consider app.config remapping of assembly "System.Web.Mvc, Culture=neutral, PublicKeyToken=31bf3856ad364e35" from Version "3.0.0.0" [C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.Mvc.dll] to Version "4.0.0.0" to solve conflict and get rid of warning.
...and same warnings for System.Web.WebPages, System.Web.Razor, System.Web.WebPages.Deployment, System.Web.WebPages.Razor
> C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3247: Found conflicts between different versions of the same dependent assembly.

我通过在web.config中添加以下行来完成警告消息的建议:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
        ...the same for the other assemblies
    </runtime>
</configuration>

就是这样--T4MVC运行正常。有时候,NuGet会自动添加这些行,我不知道为什么现在不这样。

此解决方案还解释了为什么创建新的Web项目和复制源代码可能会解决此问题。

答案 1 :(得分:0)

基于堆栈,它似乎无法访问请求上下文,这与T4MVC无关。要隔离,你可以删除T4MVC线并简单地尝试写:

@ViewContext.RequestContext

在你看来?您也可以尝试@Html.ViewContext.RequestContext。我猜你会看到同样的例外。如果是这样,我不确定是什么导致它,但至少它让你更近了一步。

要尝试的另一件事:常规MVC ActionLink是否有效,或者只有T4MVC ActionLink失败?

答案 2 :(得分:0)

我和大卫·埃博(David Ebbo)一起研究了这个问题(非常感谢他的时间),并且找不到它为什么不起作用。

在我的项目中使用我自己的名称空间复制粘贴T4MVC代码并使用这些方法后它正在工作..

所以,我刚刚重新创建了一个新的MVC网站并重新导入了所有内容..不好玩,但我相信T4MVC值得一试:)

答案 3 :(得分:0)

好的,所以我知道我的答案相当晚,但可能有助于其他人。在我的情况下一切顺利,直到我突然发生了这个错误:

[ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index]
   System.Collections.ObjectModel.Collection`1.set_Item(Int32 index, T value) +14406551
   System.Web.Mvc.Html.LinkExtensions.RouteLink(HtmlHelper htmlHelper, String linkText, String routeName, String protocol, String hostName, String fragment, RouteValueDictionary routeValues, IDictionary`2 htmlAttributes) +89
   System.Web.Mvc.T4Extensions.ActionLink(HtmlHelper htmlHelper, String linkText, ActionResult result, Object htmlAttributes, String protocol, String hostName, String fragment) +338
   System.Web.Mvc.T4Extensions.ActionLink(HtmlHelper htmlHelper, String linkText, ActionResult result, Object htmlAttributes) +107
   ASP._Page_Views_Shared__Layout_cshtml.Execute() in c:\work\[...]\Views\Shared\_Layout.cshtml:29
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +280
   System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +126
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +196
   System.Web.WebPages.WebPageBase.Write(HelperResult result) +89
   System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName, Action`1 body) +233
   System.Web.WebPages.WebPageBase.PopContext() +291
   Castle.DynamicProxy.AbstractInvocation.Proceed() +116
   Glimpse.Core.Extensibility.ExecutionTimer.Time(Action action) +85
   Glimpse.Core.Extensibility.AlternateMethod.NewImplementation(IAlternateMethodContext context) +186
   Castle.DynamicProxy.AbstractInvocation.Proceed() +604
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +378
   Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionResult_callback(ControllerContext controllerContext, ActionResult actionResult) +21
   Castle.DynamicProxy.AbstractInvocation.Proceed() +116
   Glimpse.Core.Extensibility.ExecutionTimer.Time(Action action) +85
   Glimpse.Core.Extensibility.AlternateMethod.NewImplementation(IAlternateMethodContext context) +186
   Castle.DynamicProxy.AbstractInvocation.Proceed() +604
   System.Web.Mvc.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17() +33
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +853420
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +265
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +837892
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +28
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +65
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +51
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +51
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288

在我的情况下,问题是在web.config中我已经为配置元素添加了 xmlns 属性:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

原来只是

<configuration>

通过删除xmlns,我收到了web.config警告,但我的网站又恢复了工作,我可以继续工作了。

<强> [更新]

我想添加我认为是这个问题的真正解决方案,但我看到gius bellow已经写过了。所以是的,问题是缺少&lt; bindingRedirect&gt;在网络配置中:

<dependentAssembly>
   <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
   <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>