2012-05-28 5 views
0

asp mvc3으로 작업하기 시작할 때 스크립트를 내보기 파일 (cshtml)에 넣었습니다. 나는 이렇게했다 : 각 cshtml 파일의 맨 아래에, 나는 내 스크립트를 넣었고 .... 몇몇 스크립트는 TempData를 사용했다. 모든 것이 잘 작동한다.tempdata가 mvc3의 javascript에서 작동하지 않습니까?

누군가가 내게 스크립트를 코딩하는 방법을 사용자가 볼 수있게하는 것이 나쁜 습관이라고 말했습니다.

<script src="@Url.Content("~/Scripts/myOwnLocalScripts.js")" type="text/javascript"></script>. 

그래서 내가 그랬어하지만 내 스크립트는 이제 TempData 읽을 캔트 것으로 보인다 심지어 세션 쿠키 : 그들은 내가 JS 파일을 만들고 거기에 내 모든 스크립트를 넣어 난 그냥 이런 식으로 그들에게 전화해야한다고 말했다 . 나는이 같은 내 스크립트에 라인이 : 사용자 수를 표시하기로했다하지만 문자열로 "System.Web.HttpContext.Current.Session ["UserNumber을 "]"표시됩니다

var currentEmployee = '@System.Web.HttpContext.Current.Session["UserNumber"]'; 
$('.textBoxEmployeeNumber input[id="EmployeeId"]').val(currentEmployee); 

을 ... .이 Tempdata는 [successMessage] 값을 포함하는 경우에만 표시해야하는데

if ('@TempData["successMessage"]' != "" || '@TempData["successMessage"]' != null) { 
    function newAlert(type, message) { 
     $("#alert-area").append($("<div class='alert alert-success " + type + " fade in' data-alert><p><b> " + message + " </b></p></div>")); 
     $(".alert-success").delay(4000).fadeOut("slow", function() { $(this).remove(); }); 
    } 
    newAlert('success', '@TempData["successMessage"]'); 
} 

하지만 매번 페이지가로드를 표시 유지하고이 표시됩니다 :

는 또한,이처럼 내 스크립트 코드를 '@TempData [ "successMessage"]'... 문자열로 ...

무엇이 오류입니까?

답변

2

@... 구문은 서버 쪽 Razor (.cshtml) 파일 내에서만 해석됩니다. JavaScript (.js) 파일에서 @은 특별하지 않습니다.이 경우 문자열 리터럴의 다른 문자 일뿐입니다.

로에 대한 :

그때 누군가가 사용자가 내가이 별도의 .js 파일에 대한 실제 이유는 아니다 내 스크립트

를 코딩하는 방법을 볼 수 있도록 자사의 나쁜 습관 저에게 말했다 - 경우 브라우저는 자바 스크립트를 읽을 수 있으며, 사용자는 그것을 읽을 수 있습니다.

실제로 유용하게 사용되는 것은 DRY 일 수 있으며 여러보기에 포함하기 위해 한 번 일반적인 기능을 정의하고보기가 업데이트되는 동안 브라우저가 스크립트를 캐시 할 수 있도록 허용하는 것입니다.

.js :

function setCurrentEmployee(currentEmployee) { 
    $('#EmployeeId').val(currentEmployee); 
} 

function newAlert(type, message) { 
    if (message != "" || message != null) { 
     $("#alert-area").append($("<div class='alert alert-success " + type + " fade in' data-alert><p><b> " + message + " </b></p></div>")); 
     $(".alert-success").delay(4000).fadeOut("slow", function() { $(this).remove(); }); 
    } 
} 

.cshtml :

<script> 
    setCurrentEmployee('@System.Web.HttpContext.Current.Session["UserNumber"]'); 
    newAlert('success', '@TempData["successMessage"]'); 
</script> 
0

경우 이러한 일반적인 작업 인 경우

따라서는 .cshtml에서 호출 할 수있는 .js 그들에 대한 함수를 정의 cshtml에서 인라인 자바 스크립트를 사용하고 싶지 않은 경우 JavaScriptModel ()을 사용하십시오.).

당신은 당신의 컨트롤러 액션에 다음 코드를 작성해야 :

this.AddJavaScriptVariable("CurrentEmployee", System.Web.HttpContext.Current.Session["UserNumber"]); 
this.AddJavaScriptVariable("SuccessMessage", successMessage); 
this.AddJavaScriptFunction("ReadyFunction"); 

의 .js :

var CurrentEmployee; 
var SuccessMessage; 
function ReadyFunction() 
{ 
    setCurrentEmployee(CurrentEmployee); 
    newAlert("success" SuccessMessage); 
} 

가 또는 당신은 또한 당신의 컨트롤러 액션에 다음 코드를 작성할 수 있습니다

this.AddJavaScriptFunction("setCurrentEmployee", System.Web.HttpContext.Current.Session["UserNumber"]); 
this.AddJavaScriptFunction("newAlert", "success", successMessage); 

하지만 첫 번째 해결 방법을 권하고 싶습니다. 다른 위치에서 currentEmployee 자바 스크립트.

관련 문제