2011-12-12 4 views
4

에서 슬래시 공백 I가 내 Global.asax에 (MVC 3 웹 프로젝트)에 정의 된 다음과 같은 경로 :MVC 3 - 경로

routes.MapRoute(
       "BlogCategory", // Route name 
       "Blog/Category/{*category}", // URL with parameters 
       new { controller = "Blog", action = "Index", category = "" } // Parameter defaults 
      ); 

그리고 내 행동은 다음과 같이 찾고, 카테고리 매개 변수를 허용합니다

public ViewResult Index(string category, int page = 1) 
     { 
      PostListViewModel viewModel; 
      if (string.IsNullOrEmpty(category)) 
      { 
....show all cats else show only the one passed in 

이 잘 작동하고 적절하게 내 결과를 필터링, 컨트롤러에 이르기까지 범주를 전달합니다. 범주 중 하나가 내가이 같은 모양을 만들 때

내 문제가있어입니다 카테고리 이름 :

:

Projects/Lab

(공간을 기록하고 슬래시)

이 이런 유사한 URL을 생성

/Blog/Category/Projects%20/%20Lab

내가 링크를 수행 할 때,이 오류 얻을 :

을 0

디버깅 할 때 인덱스 동작에 도달하지 않습니다.

내 질문은이 작업을 수행하려면 어떻게해야합니까? 아니면 발생하지 않도록 카테고리 이름을 만들 때 입력 유효성 검사를해야합니까?

+1

대신 카테고리 ID를 전달한 것으로 생각하세요? – Tyrsius

+0

입력 된 값에 맞게 트림을 수행해야합니다. 공백을 확인하는 것뿐만 아니라 일부 문자가 URL ("Ñ"또는 다른 영어 이외의 문자)에 표시되지 않습니다. 다른 언어가 있다는 것을 기억하십시오. 그래서,이 모든 것을 피하기 위해서 ... 나는 당신이 카테고리 ID를 찾으러가는 것이 좋습니다. – Romias

답변

0

먼저 Tyrsius, Romias 및 eth0 님의 제안에 감사드립니다.

는 내가 카테고리의 ID를 사용하지 않았다는 것을 결정 나는이 정말 루트 문제를 해결하지 않는 한 경로 처리기를 만들 싶지 않았다.

대신 "UsedAsUrl"이라는 유효성 검사 속성을 만들고이를 내 도메인 모델의 내 Category.Name에 적용했습니다. 이것은 최종 유효성 검사 (최종 사용자에게 유용함)와 개발자 관점에서의 재사용 가능성의 이점을 제공합니다.

public class Category 
{ 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int Id { get; set; } 

     [Required] 
     [UsedAsUrl] 
     [MaxLength(50, ErrorMessage = "One word or groups of words please")] 
     public string Name { get; set; } 

     public virtual List<Post> Posts { get; set; } 
} 

을 그리고 속성은이 같은 외모 생성 :

그래서 내 카테고리의 모델은 이제합니다 ([UsedAsUrl] 속성을 유의)과 같다 내가 추가 갈 때 이제

using System; 
using System.ComponentModel.DataAnnotations; 
using System.Text.RegularExpressions; 

namespace CommonWebsiteUtilities.Attributes 
{ 
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
    public class UsedAsUrlAttribute : ValidationAttribute 
    { 
     public UsedAsUrlAttribute() : base("Must not contain a slash with spaces either side") {} 

     public override bool IsValid(object value) 
     { 
      var input = value.ToString(); 
      var result = true; 

      if (input.Contains("/")) 
      { 
       input = Regex.Replace(input, @"\s+", " "); 
       if (input.Contains(" /")) result = false; 
       if (input.Contains("/ ")) result = false; 
       if (input.Contains("/")) result = false; 
      } 

      return result; 
     } 
    } 
} 

을 카테고리 :

adding a category that I know will fail validation

나는이 응답 자동 게이트를 얻을 수 atically :

Failed response with validation

JS 아직 작동하지 않습니다,하지만 내 컨트롤러는 모델의 상태를 선택할 수 있으며,이 그것에서 응답, 그래서 속성이 제대로 작동합니다.

기본적으로 어느 쪽이든/어떤 쪽이든 공백이있는 슬래시를 확인합니다. 이 URL은 철저한 URL 유효성 검사기가 아니지만 현재 프로젝트에 적용됩니다. 누구든지 개선 사항이 있으면 알려 주시면 답변을 수정하겠습니다.

RegExp에 만족스럽지 않으므로 RegularExpressionAttribute에서 파생되지 않았으며 내 모델 내부에서 오류 메시지를 제공하고 싶지 않았습니다. 범주를 URL 부분으로 사용할 때 더 많은 규칙이 표시 될 때이 속성을 실제로 작성해야합니다.

0

Tyrsius는 카테고리 ID를 전달하는 것이 더 쉽다고 제안했지만 이름을 전달하려면 링크를 만들거나 UrlHelper을 만들 때마다 Url.Encode()을 사용할 것을 제안합니다. 일단 컨트롤러가 작동하면 Url.Decode() 원래 문자열을 되 돌리십시오.

더 깨끗한 방법은 자신의 경로 처리기 (구현 IRouteHandler) 당신을 위해 그것을 할을 생성하는 것입니다.

+0

@Tyrsius 그냥이 페이지에서 스택 오버 플로우에서처럼, 궁금 - URL의 이름 부분이 자동/대체 인코딩 할 것 같다 MVC-3-슬래시 - 및 - 공간 -에 - 경로 이 아무튼 오는 방법 예 : 프로젝트 -/- 실험실 또는 이와 비슷한 질문이 있으십니까? – Hoecuspocus