2010-03-07 4 views
6

는 내가 기본 키와 null 일 수 없습니다ASP.NET MVC - ModelState.IsValid가 false 인 경우 무시하는 방법은 무엇입니까?

[Authorize] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult CreateCustomer(GWCustomer customer) 
{ 
    if (string.IsNullOrEmpty(customer.CustomerName)) 
    { 
     ModelState.AddModelError("CustomerName", "The name cannot be empty"); 
    } 
    //... 
    if (ModelState.IsValid) 
    { 
     //insert in db 
    } 
} 

내 문제가 GWCustomer 객체가 Id을 가지고 있다는 것입니다 고객을 작성하고 작은 응용 프로그램이 있습니다. 그러면 유효성 검사 프레임 워크에 오류로 표시됩니다. 그러나 오류가 아니며 고객을 아직 만들지 않았으며 현재는 저장 될 때까지 null이어야합니다. 어떻게 우회합니까? 아니면 고쳐?

ModelState이 유효하지 않으므로 결코 DB에 삽입하지 못합니다.

편집 저는 Linq to SQL과 저장소 패턴을 사용하고 있습니다.

+0

실제로 유효성을 검사하는 방법에 대한 정보는 제공하지 않았습니다. 아마도 이것을 포함시키고 자 할 것입니다. 유효성 검사 프레임 워크는 무엇입니까? 검증 속성/메소드는 어떻게 생겼습니까? – Aaronaught

+0

EntityFramework를 사용하면 모델 또는 DAO에 새 기본 개체를 요청한 다음 데이터를 채 웁니다. Metske Design Patterns에서는 "Builder"라고 불리는 반면 "Prototype"은 시도합니다. MVC는 이러한 접근 방식을 조금 더 좋아할 것입니다. –

+0

귀하의 편집 내용은 여전히 ​​"유효성 확인 프레임 워크"에 대해 설명하지 않습니다. Linq to SQL과 Repository Pattern은 검증 프레임 워크가 아닙니다. Linq to SQL은 Object-Relational Mapper이고 Repository Pattern은 CRUD 추상화입니다. 이들 중 어느 것도 ModelState와 상호 작용하지 않습니다. ID 유효성 검사 오류가 실제로 어디에서 발생합니까? 어떤 클래스/컴포넌트입니까? 실제로 ID의 유효성을 검사하는 코드 행은 어디에 있습니까? – Aaronaught

답변

24

이 바인딩에서 값을 제외하지만 검증합니다

public ActionResult CreateCustomer([Bind(Exclude = "Id")]GWCustomer customer) 

에도 유효성 검사가 수행 할 수 있습니다 아직 정확한 ModelState을 발생할 때 호출하여 :

ModelState.Remove("Id"); 

그것은 이드와 관련된 항목을 제거하고 Id 만 오류를 일으키는 경우 ModelState.Valid 속성을 true로 변경하십시오.

뷰 레이어에서 데이터 레이어 개체를 사용하지 않는 것이 좋습니다. Id 필드가 없으면 전용 뷰 모델을 작성하는 것이 좋습니다.

@Html.HiddenFor(model => model.Id) 

그것을 삭제하고 뷰가 모델과 해당 매개 변수를 전송하지 않습니다 :

+1

이것은 당신이 찾고있는 것입니다. – Rippo

+1

건배 - 매력처럼 작동합니다. –

+1

ModelState.Remove는 내가 특성을 무시하는 것으로부터 나를 보호하기 위해 필요한 것입니다. 감사! –

2

저는 ViewModel 객체 (입력 및 출력)가 도메인 객체와 분리되어야한다고 항상 말합니다.

입력 모델은 위와 같은 방법으로 유효성을 검사해야합니다. 도메인 객체 상태는 데이터베이스에 쓰여지기 전에 유효성을 검사해야합니다 (어떤 식 으로든 무효화되면 예외가 throw됩니다).

+1

나는 저장소 패턴을 가지고있다. 내 CRUD는 당신이 설명하는 것을하기 위해 별도의 클래스에있다. 내 도메인 객체의 유효성을 검사하려하지만 유효성 검사 프레임 워크가 저와 함께 어지럽게 보인다. 나는 도메인 객체와 입력/출력의 분리를했다고 생각한다 - "책"에 의해 –

+0

@pdr 나는이 대답에 완전히 동의한다. 항상 도메인 개체가 아니라 뷰 모델에 바인딩하십시오. 그것은 분리 된 논리입니다. 수락 된 대답으로 문제가 해결 될 수도 있지만 최선의 방법은 아닙니다. –

3

아마 당신은 당신의보기에이 라인을 가지고있다.

+0

그러나 EF는 새로운 엔터티의 생성으로 'Id'를 '0'으로 취하지 않습니까? – Ciwan

관련 문제