2012-03-01 3 views
3

Иногда мое приложение генерирует URL-адрес, которые выглядят как http://localhost/?Area= или http://localhost/SomeController?Area=Как предотвратить? Area = от добавления сгенерированных адресов

Я в настоящее время не имеет какие-либо области, определенные в этом проекте, и я попытался удалить регистрацию области от запуска приложения.

Единственный ответ, который я нашел, - использовать URL-адреса <a href="Url.Action()">.

Должен быть более чистый способ его устранения. Вручную удалить это из URL-адресов, похоже, дает тот же результат, но я не уверен, почему это происходит в первую очередь.

Как решить эту проблему с помощью системы маршрутизации? обратите внимание, что я использую t4mvc генерировать actionlinks не по умолчанию ActionLink хелперов MVC

Edit:

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 



    /// <summary> 
    /// Registers MVC Routing Collection. 
    /// </summary> 
    /// <param name="routes">The routes.</param> 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 




     routes.MapRoute(
      "secstdsrte", 
      "SecondaryStandards/{standardType}/{sampleid}", 
      MVC.Reports.SecondaryStandards(), 
      null, 
      new { standardType = new SecondaryStandardTypeConstraint() 

      } 
     ); 


     routes.MapRoute(
      "misaRoute", 
      "Misa", 
      MVC.Reports.MISA() 
      ); 

     routes.MapRoute(
      "outfallroute", 
      "Outfalls/{fromDate}/{toDate}", 
      MVC.Reports.Outfalls(ApplicationController.DefaultFromDate, ApplicationController.DefaultToDate), 
      null, 
      new 
      { 
       fromDate = new DateTimeConstraint(), 
       toDate = new DateTimeConstraint() 
      } 
     ); 

     routes.MapRoute(
      "offspecRoute", 
      "Offspec/{fromDate}/{toDate}", 
      MVC.Reports.OleOffspec(ApplicationController.DefaultFromDate, ApplicationController.DefaultToDate), 
      null, 
      new //route constraints 
      { 
       fromDate = new DateTimeConstraint(), 
       toDate = new DateTimeConstraint() 
      } 
     ); 

     routes.MapRoute(
      "searchRoute", 
      "Search", 
      MVC.Reports.Search() 

     ); 





     routes.MapRoute(
     "compareresultsroute", 
     "compare/{samplePoint}/{analysis}/{fromDate}/{toDate}", 
     MVC.Reports.CompareResults(null, null, null, ApplicationController.DefaultFromDate, ApplicationController.DefaultToDate), 
     null, 
     new 
     { 
      samplePoint = new SamplePointExistsConstraint(), 
      analysis = new AnalysisExistsConstraint(), 
      fromDate = new DateTimeConstraint(), 
      toDate = new DateTimeConstraint() 
     } 

     ); 

     routes.MapRoute(
     "reportsRoute", 
     "Reports/{samplePoint}/{fromDate}/{toDate}", 
     MVC.Reports.Results("", ApplicationController.DefaultFromDate, ApplicationController.DefaultToDate), 
     null, 
     new //route constraints 
     { 
      samplePoint = new SamplePointExistsConstraint(), 
      fromDate = new DateTimeConstraint(), 
      toDate = new DateTimeConstraint() } 
     ); 

     routes.MapRoute(
      "railcarsRoute", 
      "RailCars/{forDate}", 
      MVC.Reports.RailCars(ApplicationController.DefaultToDate), 
      null, 
      new { forDate = new DateTimeConstraint() } 
     ); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new 
      { controller = "Reports", action = "Index", id =UrlParameter.Optional } // Parameter defaults 
     ); 
    } 
    /// <summary> 
    /// Returns boolean value indicating whether the application is currently in debug mode 
    /// </summary> 
    public static bool isDebugging 
    { 
     get 
     { 
      return HttpContext.Current != null && HttpContext.Current.IsDebuggingEnabled; 
     } 
    } 




    protected void Application_Start() 
    { 

     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 
+2

0 Что вы используете для создания URL-адресов? Я никогда не видел, чтобы стандартные помощники URL добавляли Area = к URL. Даже если вы используете Areas, вы все равно не получите URL-адреса. Области, как правило, имеют форму/localhost/area/controller/action – mfanto

+3

Можете ли вы опубликовать таблицу маршрутов и код, который вы используете для генерации URL-адресов? – bhamlin

+0

Обновлено сообщение с маршрутизацией –

ответ

1

Этот вопрос обсуждался ранее на T4MVC @Url.Action(MVC.Controller.Action()) Renders "?Area=" Parameter in QueryString.

Короче говоря, это ошибка в T4MVC, когда сайт не использует области. Вы можете обойти эту строку (около строки 303):

result.RouteValueDictionary.Add("Area", area ?? ""); 
+0

david ebbo на помощь еще раз = D bounty - ваш –

+0

, когда он позволяет мне его наградить –

1

Вы более чем вероятно, в конечном итоге вызывая неправильную перегрузку ActionLink. Есть перегрузка, которая берет RouteValueDictionary, и люди путают его для атрибутов html (похоже, похоже).

@Html.ActionLink("Link", "Action", "Controller", new { id = 1 }, new { @css="myclass" }) 

Если вы не указали значение маршрута, используйте значение null.

@Html.ActionLink("Link", "Action", "Controller", null, new { @css="myclass" }) 
+0

im, используя ссылки t4mvc с помощниками действий, но плохо взгляните на него –

+0

, используя стандартные помощники ссылок на действия, устраняет проблему, но все равно происходит при использовании ссылок t4mvc, это ошибка в t4mvc, которая неправильно устанавливает область или проблема с тем, как она определена при маршрутизации –

 Смежные вопросы

  • Нет связанных вопросов^_^