2010-01-12 1 views
1

아래의 변수 email은 두 번 사용됩니다. 먼저 <p> 태그 내부에 입력 한 다음 textbox의 값으로 전달됩니다.아주 이상한 행동 : 하나의 변수 - 동일한 코드에서 두 개의 서로 다른 값!

질문 : 두 경우 모두 동일한 텍스트가 생성됩니까? 믿거 나 말거나 - 그들은 다릅니다.

#UserProfileEditForm form = (UserProfileEditForm)ViewData["form"]; 
#string email = form.email; 
<p>Email: ${HttpUtility.HtmlEncode(email)} <a class="ajax edit" href="${editEmailUrl}">Edit</a></p> 
#if (form.editEmail) 
#{ 
    <form name="f_email" action="${editEmailUrl}" ....> 
     ${Html.TextBox("form.email", email, new { @class="ajax string"}) } 
    </form> 
#} 
</div> 

내가 서버에 위의 양식을 제출하고 의도적으로 잘못된 이메일 주소를 입력 할 때, 양식 (명확성을 위해 여기 omited) 오류 메시지가 다시 나에게 반송됩니다. 전자 메일 값은 HTML에 두 번 나타납니다. 위 코드와 모두 일치합니다. 유일한 문제는 <p> 태그 내의 이메일 값이 텍스트 상자의 이메일 값과 다를 수 있다는 것입니다. 샘플 출력은 다음과 같습니다.

<p>Email: [email protected] <a class="ajax edit" href="...">Edit</a></p> 
    <form class="ajax edititem" name="f_email" id="f_email" .....> 
     <input class="ajax string" id="form_email" type="text" value="changed````@testing.gov" /> 
    </form> 
</div> 

어떻게 될까요? 코드에서 두 번 사용 된 같은 변수를 한 번만 할당하면 두 개의 다른 값을 전달할 수 있습니까 ???

답변

1

Html.TextBox는 ModelState에서 사용할 수있는 경우 필드의 이전 값을 사용합니다 (요청시 MVC 내부에서 유지됨). "전자 메일"변수 값을 강제로 사용하려면 ModelState를 지우십시오 (이 필드 또는 완전하게).

+0

당신은 천재입니다. 수락하고 투표하십시오. – Andy

+0

그런데 유효성 검사 오류를 유지하려면 ModelState.Clear()를 사용하지 마십시오. ModelState [ "email"]처럼 값을 변경하십시오 .Value = new ValueProviderResult (...). – queen3

0

두 번째 스레드가 전자 메일의 값을 수정하는 두 번째 스레드를 실행할 수 있습니다. 또는 첫 번째와 두 번째 출력 사이에서 발생하는 일부 연산은 ASP.NET에서 직접 포인터 조작을 허용하는 경우 값 (또는 포인터)을 덮어 쓸 수 있습니다. ASP.NET에 익숙하지 않습니다. 또는 Html.TextBox 메서드는 값을 변경할 수 있습니다 (사용자 정의 구현 또는 표준 라이브러리의 확장입니까?).

+0

Spark은 뷰 엔진입니다. http://sparkviewengine.codeplex.com/ 또는 http://sparkviewengine.com/ –

+0

변수가 로컬이므로 다른 스레드에서 변수를 변경할 방법이 없습니다 (특히 모든 페이지 제출시 일관되게 수행 할 방법이 없음). – Andy

+0

그럼 뭔가하는 Html.TextBox 향해 기댈거야. Html.TextBox 호출 후 HtmlEncode (전자 메일)를 복사하거나 붙여 넣으면 어떻게됩니까? 두 번째로 HtmlEncode를 호출해도 변경된 출력이 남아 있습니까? – atk