I’ve got an issue with MVC routing(or at least I think it’s w/routing 🙂 )…
Just upgraded to MVC RC1, but I’m not sure that it’s related as this is my first attempt at setting a MapRoute and corresponding RouteLink.
here’s the route:
routes.MapRoute('Test1', 'Forecast/CurrentLineItems/{propertyID}/{forecastYear}/{forecastMonth}', new { controller = 'Forecast', action = 'CurrentLineItems', propertyID = '', forecastYear = '', forecastMonth = '' } );
here’s the RouteLink…in the view it’s wrapped in a table cell:
Html.RouteLink(Html.Encode(myProperty.Description),'Test1', new { controller = 'Forecast', action = 'CurrentLineItems', propertyID = myProperty.PropertyID.ToString(), forecastYear = '2008', forecastMonth = '10' })
here’s a snippet from the controller:
namespace AnApplication.Controllers { [HandleError] [Authorize] public class ForecastController : Controller { [AcceptVerbs(HttpVerbs.Get)] public ActionResult CurrentLineItems(string propertyID, string forecastYear, string forecastMonth) { //Some code }
Now for the strange behavior, when I click the link specified by the RouteLink, the app enters the CurrentLineItems method and all the method arguments are correct… then it enters the CurrentLineItems method again!
with, for instance, these arguments:
propertyID = 'scripts' forecastYear = 'jquery-1.2.6.js' forecastMonth = ''
It then repeats this several times as it seems to run through all the scripts on this view and the Site.Master and then the last one is the .css file for this page!
What is going on!
The Call Stack is of no help as it lists the above-mentioned CurrentLineItems method and then below that is the dreaded [External Code]
When I profile the page/view in FireFox/FireBug all I see are the jQuery calls
Here’s the html from the Site.Master re the scripts
<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>
here’s a snippet from the view re the scripts
<%@ 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>-->
Note that this ActionLink works fine(It’s basically just a menu item used for testing and the three arguments are set in the code inside the controller…):
<%= Html.ActionLink('Line Items', 'CurrentLineItems', 'Forecast')%>
Any help in solving this issue is greatly appreciated.
Thanks,
Greg
It could be caused by the usage of relative paths to include the scripts.
When you click on the link the URL of the new page will be something like http://[server]/Forecast/CurrentLineItems/xxx/2009/1
Now check the html code in the browser: If the URLs are in the form of ‘../../scripts/jquery-1.2.6.js’, this will cause the browser to load it from http://[server]/Forecast/CurrentLineItems/scripts/jquery-1.2.6.js – and so your controller gets called again.
If that is the case you could either use absolute paths (‘/scripts/jquery-1.2.6.js’) or use a path relative to the application root (‘~/scripts/jquery-1.2.6.js’) and resolve it on the server side with Page.ResolveClientUrl().
Maybe there has been a change from Beta to RC1, so that the URLs in the head, even with runat=’server’, don’t get remapped.