2013-02-18 2 views
1

모델의 내 규칙에서 확인되지 않은 비즈니스 규칙에 대한 유효성 검사 메소드를 만들었지 만 제대로 작동하도록하는 데 문제가 있습니다. 가능한 시나리오는 두 가지 (고객 또는 판매자 등록)이므로 개별보기 및 모델로 별도로 처리해야합니다. 판매자 등록은 기본 정보에 대한 고객 등록을 상속하므로 고객의 모든 필드도 판매자에 포함됩니다. 그러나 두 가지 모델로 작업하고 있기 때문에 두 필드 모두 유효성 검사를 수행하는 필드가 같지만 동일한 유효성 검사 메서드를 사용하려면 Object을 사용해야했습니다. 하지만 불행히도 나는 그렇게하는 데 어려움을 겪고있다.유형에 따라 객체 캐스팅

[CustomHandleError] 
private bool ValidateRegistrationForm (Object registerViewModelObject) { 
    if (registerViewModelObject is RegisterViewModel) 
    { 
     RegisterViewModel registerViewModel = 
      (RegisterViewModel)registerViewModelObject; 
    } 
    else 
    { 
     RegisterSellerViewModel registerViewModel = 
      (RegisterSellerViewModel)registerViewModelObject; 
    } 

    if (ModelState.IsValid) 
    { 
     string [] names = registerViewModel.Name.Split (
      new string [] {" "}, StringSplitOptions.RemoveEmptyEntries); 
     if (names.Length == 1) 
      ModelState.AddModelError ("Name", "Fill your full name"); 

     if (CustomerUtilities.IsCpf (registerViewModel.Identity) == false) 
      ModelState.AddModelError ("Identity", "Invalid CPF value"); 

     if (this.AuthenticatorService.IsExistentUser (registerViewModel.Email)) 
      ModelState.AddModelError ("Email", "Email already registered"); 
    } 
} 

당신이 볼 수 있듯이, if (ModelState.IsValid) 후 인텔리이 현재 컨텍스트에 registerViewModel을 찾을 수 없습니다. 그 이유는 궁금하다. 그 변수는 if와 else의 내부에 정의되어 있기 때문에 정의되지 않은 채로 그 코드에 접근 할 수있는 방법이 없다.

새 방법을 만들거나 2 개의 변수를 전달하는 것 이외에 다른 해결 방법이 있습니까?

+2

여기에 코드를 이미지가 아닌 텍스트로 붙여 넣으십시오. –

+1

코드 블록을 코드 블록으로 붙여 넣으면보다 정확한 답변을 얻을 수 있습니다. 올바른 예제를 쉽게 생성 할 수 있기 때문입니다. – driis

+0

빠른 수정은 if 및 else 블록에 코드를 복사하여 붙여 넣는 것입니다. 문제는 등록에 대한 공통 기본 클래스가 없거나 상속이 제대로 사용되지 않는다는 것입니다 (판매자 등록이 일종의 고객 등록으로 보이지 않으므로 상속이 어색 할 것입니다). 이 문제를 해결하려면 디자인 작업을해야합니다. –

답변

1

두 개의 개별 변수가 필요하면 if 문 외부에서 선언하고 null 후에 테스트하십시오.

RegisterViewModel registerViewModel; 
RegisterSellerViewModel sellerModel; 

if (registerViewModelObject is RegisterViewModel) 
{ 
    registerViewModel = (RegisterViewModel)registerViewModelObject; 
} 
else 
{ 
    sellerViewModel = (RegisterSellerViewModel)registerViewModelObject; 
} 

그러나 Object 대신 사용할 인터페이스를 정의하는 것이 더 좋습니다.

public interface IRegisterViewModel 
{ 
    public string Name { get; set;} 
    public ... Identity {get; set;} 
    ... 
} 

public class RegisterViewModel : IRegisterViewModel 
{ 
    ... 
} 

public class RegisterSellerViewModel : IRegisterViewModel 
{ 
    ... 
} 

그런 다음 ValidateRegistrationForm (IRegisterViewModel registerViewModel)를 사용하면 완전히 if 문을 제거 얻을 수 있습니다.

+0

이 접근법의 문제점은'if (ModelState.IsValid)'블록 내부의 코드 중복입니다. 나는 더 깔끔하고 깨끗한 것을 찾고 있었다. 타이 비록 도움이된다면 – leobelones

+0

내가 그것을하는 인터페이스 방식으로 추가했다. 그것은 너의 (그리고 내) 좋아하는 것일 수있다. –

2

if 블록 범위 외부에 RegisterViewModel을 선언하고 if 블록 내에 할당하십시오.

RegisterViewModel registerViewModel; 
if (registerViewModelObject is RegisterViewMOdel) 
{ 
    registerViewModel = // ... 
} 
else 
{ 
    registerViewModel = // ... 
} 
+0

빠른 답변을 주셔서 감사합니다.하지만 그럴 경우 Object가 필요하지는 않습니다. 문제는 두 개의 다른 모델이 있다는 것입니다. 런타임에서 정의 할 모델을 정의합니다. – leobelones

+0

그러면 ModelState.IsValid if 절에서 코드를 수행 할 수있는 공통 기본 클래스 또는 인터페이스가 필요할 것입니다. – driis

1

당신은 당신의 if statemtent에서 외부 RegisterViewModel를 정의해야합니다. 그리고 if 성명서에 과제를하십시오.

좋아요;

RegisterViewModel registerViewModel; 
if(...) 
{ 
    //make your assigment here. 
} 
+0

나는 다른 대답에 대해 언급 했으므로 사용할 모델을 모르기 때문에 if 외부에서 선언 할 수 없습니다. – leobelones

0

당신은 아마도 인터페이스에 RegisterViewModelRegisterSellerViewModel에 대한 일반적인 방법을 추출하고 두 클래스에서 그것을 구현해야합니다. 그런 다음 실제 유형에 관계없이 registerViewModelObject을이 인터페이스에 캐스트하십시오.

0

이 문제는 함수의 주요 범위에 정의 된 단일 변수가 없기 때문에 발생합니다. 코드를 작성한 방법에 따라 서로 다른 범위 안에있는 두 개의 변수를 정의합니다.

솔루션으로 어떻게 갈 것인가 :

나는 기본 클래스를 만들 것입니다.

class RegisterModel 
{ 
    public string Name; 
    public IdentifyType Identify; 
    public string Email; 
} 

그리고 두 클래스 모두 기본 클래스에서 상속받을 수 있습니다. 이와 같이 :

class RegisterViewModel 
    : RegisterModel 
{...} 
class RegisterSellerViewModel 
    : RegisterModel 
{...} 

이제 함수에서 Object 변수를 한 번에 변환 할 수 있습니다.이와 같이 :

private bool Validate(Object viewModel) 
{ 
    var castViewModel = (RegisterModel)viewModel; 
    if(ModelState.IsValid) 
    { 
     ... 
    } 
} 

viewModel이 RegisterModel 유형이 아니면 런타임 오류가 발생합니다.

관련 문제