4

Я создал этот маршрут.net MVC маршрут по умолчанию контроллер/действие, но не по умолчанию параметры

  routes.MapRoute( 
       name: "Survey", 
       url: "{controller}/{action}/{surveyid}/{userid}/{hash}", 
       defaults: new { controller = "Home", action = "Survey" }, 
       constraints: new { surveyid = @"\d+", userid = @"\d+" } 
      ); 

Когда я затем перейдите к

http://localhost:3086/Home/Survey/1/1/3r2ytg 

Он работает, но если я просматриваю к

http://localhost:3086/1/1/3r2ytg 

не работает.

Если бы я тогда изменил маршрут как так

 routes.MapRoute(
      name: "Survey", 
      url: "{surveyid}/{userid}/{hash}", 
      defaults: new { controller = "Home", action = "Survey" }, 
      constraints: new { surveyid = @"\d+", userid = @"\d+" } 
     ); 

Полная противоположность будет работать (и это имеет смысл).

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

Update

В конце концов я пошел только с этим

 routes.MapRoute(
      name: "Survey", 
      url: "{surveyId}/{userId}/{hash}", 
      defaults: new { controller = "Home", action = "Survey" }, 
      constraints: new { surveyId = @"\d+", userId = @"\d+" } 
     ); 

как это поведение я хотел. Тем не менее, когда я затем вызвать

@Url.Action("Survey", "Home", new 
{ 
    userId = @Model.UserId, 
    surveyId = survey.Id, 
    hash = HashHelpers.CreateShortenedUrlSafeHash(@Model.SecretString + survey.Id.ToString() + @Model.UserId.ToString()) 
}) 

Он генерирует

/Admin/Home/Survey?userId=25&surveyId=19&hash=2Norc 

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

ответ

3

Вам необходимо создать маршрут для каждой комбинации.

Проверить это Phil Haack Article

routes.MapRoute( 
      name: "Survey", 
      url: "{controller}/{action}/{surveyid}/{userid}/{hash}", 
      defaults: new { controller = "Home", action = "Survey" }, 
      constraints: new { surveyid = @"\d+", userid = @"\d+" } 
); 

    routes.MapRoute(
     name: "Survey", 
     url: "{surveyid}/{userid}/{hash}", 
     defaults: new { controller = "Home", action = "Survey" }, 
     constraints: new { surveyid = @"\d+", userid = @"\d+" } 
); 

Проверить это Route with Two optional parameters in MVC3 not working

+0

Будьте осторожны, чтобы не заменить поток на контроллер по умолчанию/действие/ID, если вам это нужно. Если вы не можете это использовать. – Kristof

+0

Altho Ответ на этот вопрос Я обновил свой пост с прямым наблюдением, которое было бы интересно узнать –

1

routehandler не знает, что если вы говорите/1/1/3r2ytg 1 для surveyId, другие 1 для идентификатор пользователя и т.д.
Он просто знает, что путь (LOCALHOST: 3086) и й количество из «папок»
Итак, если вы позвоните http://localhost:3086/1/1/3r2ytg, он будет отображать 1 на контроллер, 1 на действие и 3r2ytg на surveyId.
Он не может найти userId или hash, и поскольку нет заданных значений по умолчанию, он не может найти маршрут.
По умолчанию в вашем первом маршруте нет смысла, поскольку они никогда не будут запускаться.
Значения по умолчанию должны быть в конце вашего URL-адреса, что имеет смысл.