ASP.Net MVC路由问题

w4i*_*4ik 0 asp.net-mvc

我有一个MVC路由问题(或者至少我认为它是w/routing :))...

刚刚升级到MVC RC1,但我不确定它是否相关,因为这是我第一次尝试设置MapRoute和相应的RouteLink.

这是路线:

routes.MapRoute("Test1",
                "Forecast/CurrentLineItems/{propertyID}/{forecastYear}/{forecastMonth}",
                 new { controller = "Forecast", action =   "CurrentLineItems", propertyID = "", forecastYear = "", forecastMonth = "" }
);
Run Code Online (Sandbox Code Playgroud)

这是RouteLink ...在视图中它包含在表格单元格中:

Html.RouteLink(Html.Encode(myProperty.Description),"Test1", new { controller = "Forecast", action = "CurrentLineItems", propertyID = myProperty.PropertyID.ToString(), forecastYear = "2008", forecastMonth = "10" })
Run Code Online (Sandbox Code Playgroud)

这是控制器的一个片段:

namespace AnApplication.Controllers  
{
[HandleError]
[Authorize]
public class ForecastController : Controller
{        
    [AcceptVerbs(HttpVerbs.Get)]        
    public ActionResult CurrentLineItems(string propertyID, string forecastYear, string forecastMonth)
    {
       //Some code
    }
Run Code Online (Sandbox Code Playgroud)

现在对于奇怪的行为,当我单击RouteLink指定的链接时,应用程序进入CurrentLineItems方法并且所有方法参数都正确...然后它再次进入CurrentLineItems方法!
例如,这些参数:

propertyID = "scripts"    
forecastYear = "jquery-1.2.6.js"  
forecastMonth = ""    
Run Code Online (Sandbox Code Playgroud)

然后它重复这几次,因为它似乎运行此视图和Site.Master上的所有脚本,然后最后一个是此页面的.css文件!
到底是怎么回事!
调用堆栈没有帮助,因为它列出了上面提到的CurrentLineItems方法,然后下面是可怕的[外部代码]

当我在FireFox/FireBug中分析页面/视图时,我看到的是jQuery调用

这是来自Site.Master的html脚本

<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title><%= Html.Encode(ViewData["Title"]) %></title>
    <script type="text/javascript" src="../../scripts/jquery-1.2.6.js"></script>  
    <script type="text/javascript" src="../../scripts/calculations.js"></script>  
    <script type="text/javascript" src="../../scripts/common.js"></script>    
    <style media="all" type="text/css">@import "../../Content/all.css";</style>
    <!--[if IE]><link rel="stylesheet" type="text/css" href="../../Content/ie.css"media="screen"/><![endif]-->      
    <!--<link href="../../Content/Site.css" rel="stylesheet" type="text/css" />-->
</head>  
Run Code Online (Sandbox Code Playgroud)

这是脚本视图中的一个片段

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"AutoEventWireup="true" CodeBehind="CurrentLineItems.aspx.cs" Inherits="AnApplication.Views.Forecast.CurrentLineItems" %>

<asp:Content ID="lineItemsContent" ContentPlaceHolderID="MainContent" runat="server">
<!--<script type="text/javascript" src="../../scripts/MicrosoftAjax.debug.js"></script>-->
<script type="text/javascript" src="../../scripts/lineItems.js"></script>
<script type="text/javascript" src="../../Scripts/jquery.formatCurrency.js"></script>
<!--<script type="text/javascript" src="../../scripts/jquery-1.2.6.min.js"></script>-->  
Run Code Online (Sandbox Code Playgroud)

请注意,此ActionLink工作正常(它基本上只是用于测试的菜单项,并且在控制器内部的代码中设置了三个参数...):

<%= Html.ActionLink("Line Items", "CurrentLineItems", "Forecast")%>
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助解决这个问题.

谢谢,
格雷格

Eil*_*lon 6

实际上,在最近发布的ASP.NET MVC Release Candidate中有两个微妙但烦人的错误.这是两个错误:

  1. 我们更改了所有的URL呈现方法,以呈现相对URL而不是绝对URL.虽然我们觉得这可能是一般的正确决定,但我们发现它打破了很多场景.AJAX场景尤其受到影响,因为异步检索数据的URL通常与浏览器地址栏中显示的原始URL不同.

  2. 特别是Html.RouteLink(而不是 Html.ActionLink)中有一个错误(所以它实际上不是红鲱鱼 - 至少不一定).Html.RouteLink会错误地接受"当前"控制器和操作,并将这些值传递给路由系统.只有Html.ActionLink应该这样做.Html.RouteLink根本不应该进行任何处理.它应该只是取你给它的值并将它传递给ASP.NET路由系统.

由于这两个错误都非常糟糕,我们决定回滚导致#1的更改并解决导致#2的问题并发布更新的ASP.NET MVC Release Candidate Refresh.

您将在ScottGu的博客,Phil Haack的博客以及详细介绍刷新的ASP.NET MVC论坛上看到一些帖子.

谢谢,艾伦