2011-10-24 1 views
2

특정 배열 변수의 설정 여부에 따라 조건부 논리가있는 일부 Razor 코드가 있습니다. 나는 그것이 null 일 때 가장 좋은 방법을 처리하는 시간을 알아내는 지옥을 가지고 있고, 나는 내 kludgy 솔루션에 만족하지 않는다. 나는 이런 식으로 뭔가해야합니다, 코드에서 나중에면도기 코드에서 널 변수의 가능성을 처리하는 방법은 무엇입니까?

@{ 
    if (ViewBag.Foo != null) 
    { 
     double[] bar = new double[ViewBag.Foo.Length]; 
    } 
} 

: 여기

는 무슨 일이 일어나고 있는지의 간단한 예제 그 코드로

@if (ViewBag.Foo != null) 
{ 
    ...some code that uses `bar` goes here ... 
} 

을, 나는 때 ViewBag.Foo 실제로 오류가 발생할 수 null bar을 사용하는 코드의 두 번째 섹션에 대해 불만을 표시하는 예외가 발생하며 범위에 포함되지 않습니다. 그러나 실행시 두 번째 섹션은 항상 건너 뜁니다.

잠시 그것으로 장난 후, 난 그냥 대신에 이런 짓을 : ViewBag.Foo가 null 및 null이 아닌 경우

이 변경으로
double[] bar; 
@{ 
    if (ViewBag.Foo != null) 
    { 
     bar = new double[ViewBag.Foo.Length]; 
    } 
} 
else 
{ 
    bar = new double[1]; 
} 

는, 코드가 작동합니다. 이걸 처리하는 더 좋은 방법이 있어야 해 ... 누구?

+0

ViewBag.Foo는 실제로 존재하지 않습니다 (코드가 잘 작동하는 동적 유형이므로). ViewBag.Foo가 존재합니까? 그렇지 않다면, 읽으십시오 : http://stackoverflow.com/questions/2634858/how-do-i-reflect-over-the-members-of-dynamic-object – Polity

+0

제 말은 ... 이것은 정확하게 당신이 ' 우선 동적 인 언어를 피하는 것이 좋습니다. 확실한 모델로 사용자 정의보기를 만드는 것을 고려 했습니까? –

답변

4

일 이런 종류의 뷰에 속하지 않은 :이 경우 이유를 정확하게

@{ 
    if (ViewBag.Foo != null) 
    { 
     double[] bar = new double[ViewBag.Foo.Length]; 
    } 
} 

당신이 한 문제의 종류입니다. 귀하의 문제는 bar의 범위가 올바르지 않은 것으로 나타났습니다. 이 작업이 ViewModel 내에서 진행 중이라면 비슷한 실수로 인해 즉시 컴파일러 오류가 발생했을 것입니다. 대신 응용 프로그램을 컴파일하고 사용할 때까지는 알 수 없으며 사용자가 제공 한 오류는 종종 숨겨진 것으로 추적하기가 어려울 수 있습니다.

+0

이 코드에 대한 더 나은 접근 방법은 무엇입니까? 대신 컨트롤러에 있어야합니까? – TMC

+0

푸 (Foo)와 바 (Bar)의 말하기가 정말 어렵습니다. 궁극적으로 그것은 당신이하는 마사지의 복잡성에 달려 있습니다. 정말 간단한 경우 ViewModel의 생성자 또는 컨트롤러에서 수행 할 수 있습니다. 개인적으로는 일반적으로 응용 프로그램의 각 뷰에 대해 ViewModel을 사용합니다. 이 뷰 모델은보기의 필드 당 속성을 가진 단순한 POCO입니다. 그런 다음 필요한 데이터를 가져와 적절한 속성을 설정하는 작업을 수행하는 ViewModel 당 ModelFactory가 있습니다. 이것은 제가 할 일입니다. –

0

당신은 자신의 문제를 해결했습니다.

if 블록 내에서 변수를 선언했기 때문에 bar 변수의 범위가 잘못되었습니다. 당신의 변화는 그것을 넓혔습니다.

관련 문제