Проблема маршрутизации ASP.Net MVC - PullRequest
0 голосов
/ 29 января 2009

У меня проблема с маршрутизацией MVC (или, по крайней мере, я думаю, что это с маршрутизацией :)) ...

Только что обновлен до MVC RC1, но я не уверен, что это связано, так как это моя первая попытка установить MapRoute и соответствующий RouteLink.

вот маршрут:

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

вот RouteLink ... в представлении он обернут в ячейку таблицы:

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

вот фрагмент из контроллера:

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

Теперь для странного поведения, когда я нажимаю на ссылку, указанную RouteLink, приложение вводит метод CurrentLineItems, и все аргументы метода верны ... затем он снова входит в метод CurrentLineItems!
например, с такими аргументами:

propertyID = "scripts"    
forecastYear = "jquery-1.2.6.js"  
forecastMonth = ""    

Затем он повторяет это несколько раз, поскольку кажется, что он запускает все сценарии в этом представлении и Site.Master, а затем последний файл .css для этой страницы!
Что происходит!
Стек вызовов не помогает, поскольку в нем перечислен вышеупомянутый метод CurrentLineItems, а затем ниже страшный [Внешний код]

Когда я профилирую страницу / представление в FireFox / FireBug, все, что я вижу, это вызовы jQuery

Вот 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>  

вот фрагмент из представления о сценариях

<%@ 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>-->  

Обратите внимание, что этот ActionLink работает нормально (в основном это просто пункт меню, используемый для тестирования, и три аргумента задаются в коде внутри контроллера ...):

<%= Html.ActionLink("Line Items", "CurrentLineItems", "Forecast")%>

Любая помощь в решении этой проблемы очень ценится.

Спасибо
Грег

Ответы [ 3 ]

6 голосов
/ 30 января 2009

В недавно выпущенном кандидате на выпуск ASP.NET MVC было две тонких, но раздражающих ошибки. Это были две ошибки:

  1. Мы изменили все наши методы рендеринга URL-адресов для отображения относительных URL-адресов вместо абсолютных URL-адресов. Хотя мы считаем, что это может быть правильным решением в целом, мы обнаружили, что оно нарушает множество сценариев. Особенно пострадали сценарии AJAX, поскольку URL-адреса для асинхронного получения данных часто отличаются от исходного URL-адреса, который отображается в адресной строке браузера.

  2. Html.RouteLink (и not Html.ActionLink) была ошибка (так что на самом деле это не красная сельдь - по крайней мере, не обязательно). Html.RouteLink ошибочно принимает «текущий» контроллер и действие и передает эти значения в систему маршрутизации. Только Html.ActionLink должен делать это. Html.RouteLink не должен выполнять какую-либо обработку вообще. Предполагается, что он просто возьмет значения, которые вы ему дадите, и передаст их системе маршрутизации ASP.NET.

Поскольку эти две ошибки были довольно серьезными, мы решили откатить изменение, вызвавшее # 1, и исправить проблему, вызвавшую # 2, и выпустить обновленный кандидат на выпуск ASP.NET MVC Refresh .

Вы увидите несколько постов в блоге ScottGu, блоге Фила Хаака и форумах ASP.NET MVC, подробно описывающих обновление.

Спасибо, Eilon

2 голосов
/ 29 января 2009

Это может быть вызвано использованием относительных путей для включения сценариев.

Когда вы нажимаете на ссылку, URL новой страницы будет выглядеть примерно так: http://[server]/Forecast/CurrentLineItems/xxx/2009/1

Теперь проверьте HTML-код в браузере: если URL-адреса имеют вид «../../scripts/jquery-1.2.6.js», это приведет к тому, что браузер загрузит его с http://[server]/Forecast/CurrentLineItems/scripts/jquery-1.2.6.js - и ваш контроллер снова вызывается.

Если это так, вы можете использовать абсолютные пути ('/scripts/jquery-1.2.6.js') или использовать путь относительно корня приложения ('~ / scripts / jquery-1.2.6.js). ') и разрешите его на стороне сервера с помощью Page.ResolveClientUrl ().

Возможно, произошло изменение с бета-версии на RC1, так что URL-адреса в заголовке, даже с runat = "server", не будут переназначены.

1 голос
/ 29 января 2009

RouteLink против ActionLink - красная сельдь здесь. Единственное, что имеет значение - это href = "[что-то]". Вы получите точно такие же результаты, если вы напишите href вручную, а не создадите его через RouteLink.

Итак, да, теперь мы перешли к маршрутизации. Внутри действия вашего контроллера, проверьте RouteData в отладчике и посмотрите, какое имя маршрута было найдено. Скорее всего, это неправильно, и это приводит к тому, что другие вещи ведут себя неправильно. Либо измените порядок своих повторений, либо добавьте ограничения, чтобы предотвратить совпадение с неправильным.

RouteLink работает очень хорошо, чтобы предотвратить поиск неправильного маршрута при создании URL. Но когда ваше приложение использует URL-адрес, вам все равно нужно упорядочить маршруты в global.asax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...