2011-10-07 3 views
2

유효성을 검사하려는 단일 Date 필드가있는 가장 간단한 모델이 있습니다. 문제는 dd.mm.yyyy으로 날짜를 입력하고 GET을 통해 제출하면 유효성 검사를 통과하지 못하는 것입니다. POST를 통해 제출하면 모든 것이 정상입니다.MVC3 : GET 요청시 ModelState에 대해 Culture가 설정되지 않았습니까?

명시 적으로 CultureInfo를 프로젝트에 적합한 값으로 설정했습니다. GET ModelState.Values.ToList()[0].Value.Culture이 InvariantCulture이고 POST의 경우 ru-RU 인 것으로 나타났습니다.

문화가 GET 요청에 설정되지 않은 이유는 무엇입니까? ASP.Net의 적절한 동작입니까? 해결 방법이 있습니까?

그냥 참조 또는 누군가가 확인하고자하는 경우, 여기에 모델의 :

public class TestModel 
    { 
     [Required] 
     [DataType(DataType.Date)] 
     public DateTime Date { get; set; } 
    } 

뷰 :

@using (Html.BeginForm("Index2", "Home", FormMethod.Get)) @* if that is changed to FormMethod.Post - everything's ok *@ 
{ 
    @Html.ValidationSummary(true) 
    @Html.EditorForModel() 
    <input type="submit" value="Ok" /> 
} 

그리고 핸들러 :

public ActionResult Index2(TestModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View("Index", model); 
     } 

     return Content("Ok"); 
    } 
+0

이 동작은 [이 비슷한 질문에] 다소 설명되어 있습니다 (http://stackoverflow.com/questions/6202735/asp-net-mvc-model-binder-parse-decimal-differently-with-get-and-post). -requests). 또한 쿼리 문자열에서 날짜와 시간을 보내는 것은 날짜와 시간이 구성된 문자를 고려할 때 매우 위험합니다. :) – bzlm

답변

4

이것은 올바른 MVC 동작입니다.

GET 요청은 쿼리 문자열을 사용하여 서버에 데이터를 보내고 POST는 요청 본문을 사용합니다.

쿼리 문자열을 포함한 URL은 일반적으로 응용 프로그램 개발자가 "소유"하므로 MVC는 불변의 문화권을 사용하여 원시 문자열 값을 모델의 개체로 구문 분석합니다. 구문 분석은 항상 로캘의 컨텍스트 내에서 발생하므로 어떤 로컬이 사용되는지 이해해야합니다.

GET을 사용할 때 불변 형식으로 날짜를 입력하거나 IIS 스레드의 culture를 사용하는 POST를 사용하거나 사이트의 구성에 따라 사용자 Accept-Language 헤더를 사용하는 것이 가장 쉬운 방법입니다.

마지막으로 IModelBinder를 구현하거나 DefaultModelBinder를 직접 확장하여이 동작을 변경할 수 있습니다.

또한 Glimpse에 대한 플러그를 넣을 것입니다. 그러면 모델에 속하는 각 속성/매개 변수에 사용되는 문화권이 표시됩니다.

+0

[이 답변] (http://stackoverflow.com/questions/6202735/asp-net-mvc-model-binder-parse-decimal-differently-with-get-and-post-requests/6202805#6202805) 행동의 특성에 대한 또 다른 설명이 있습니다. – bzlm

2

왜 GET 요청에 대한 문화가 설정되지 않았습니까?

의도적으로 설계된 동작입니다. GET 요청은 InvariantCulture를 사용하여 날짜가 형식화 될 것으로 기대합니다. 해결 방법은 사용자 정의 모델 바인더를 작성하는 것입니다.

관련 문제