0

我刚刚在我的项目中安装了 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

4 回答 4

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 项目并复制源代码可能会解决此问题。

于 2013-09-10T15:32:59.983 回答
0

根据堆栈,它似乎无法访问与 T4MVC 无关的请求上下文。为了隔离,您可以删除 T4MVC 行并简单地尝试编写:

@ViewContext.RequestContext

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

要尝试的另一件事:常规 MVCActionLink是否有效,还是只有 T4MVCActionLink失败?

于 2012-12-19T15:18:19.370 回答
0

我已经和 David Ebbo 一起研究过这个问题(非常感谢他的时间),但找不到它为什么不起作用的原因。

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

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

于 2012-12-20T07:17:37.230 回答
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 已经写了它。所以是的,问题是网络配置中缺少 <bindingRedirect> :

<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>
于 2013-07-17T14:50:58.567 回答