Javascript에서 MVC의 모델 속성에 액세스


147

뷰 모델에 래핑 된 다음 모델이 있습니다.

public class FloorPlanSettingsModel
{
    public int Id { get; set; }
    public int? MainFloorPlanId { get; set; }
    public string ImageDirectory { get; set; }
    public string ThumbnailDirectory { get; set; }
    public string IconsDirectory { get; set; }
}

Javascript에서 위의 속성 중 하나에 어떻게 액세스합니까?

나는 이것을 시도했지만 "정의되지 않음"

var floorplanSettings = "@Model.FloorPlanSettings";
alert(floorplanSettings.IconsDirectory);

5
분명히, 일어나고있는 일은 JavaScript 변수의 값을 C # 변수 "Model.FloorPlanSettings"의 값으로 설정하는 것입니다. 이는 해당 클래스의 .ToString () 값 (문자열)입니다. 그런 다음 방금 만든 JavaScript 문자열 변수에서 "IconsDirectory"라는 JavaScript 속성을 경고하려고합니다. JavaScript 문자열에는 "IconsDirectory"속성이 없으므로 정의되지 않습니다.
Joel Cochran

완전한 테스트 사례를 제공하고 모델 데이터를 자바 스크립트 변수에 할당하는 모든 시나리오를 설명했습니다.
Rajshekar Reddy

뷰 외부에서는 작동하지 않습니다 (cshtml). 즉, 뷰가 참조하는 외부 .js 파일에서.
스펜서 설리반

답변:


240

다음을 수행하여 전체 서버 측 모델을 Javascript 객체로 전환 할 수 있습니다.

var model = @Html.Raw(Json.Encode(Model));

귀하의 경우 FloorPlanSettings 객체를 원한다면 Encode해당 속성을 메소드에 전달하십시오 .

var floorplanSettings = @Html.Raw(Json.Encode(Model.FloorPlanSettings));

1
확인하기 위해;를 추가 할 필요가 없습니다. 그것의 끝에? VS에서 명령문이 종료되지 않았다는 프롬프트가 표시되기 때문에. 그러나 내가 추가하려고하면; 코드가 실행되지 않습니다
Null Reference

1
아시다시피, 다양한 프로젝트에서도 동일한 오류가 발생합니다. 그냥 무시하십시오. Visual Studio가 도와 주려고하지만이 경우에는 잘못되었습니다. 브라우저로 전송되는 결과 HTML 및 스크립트가 정확합니다.
저스틴 Helgerson

1
나를 위해 이것은 효과가 있었다 : var myModel = @ {@ Html.Raw (Json.Encode (Model));}
숨겨

1
모델이 초기 값 (페이지 편집 대신 페이지 작성)이고 "ReferenceError : 모델이 정의되지 않았습니다"가 발생하면 작동하지 않습니다.
Jack

2
ASP.Net Core에서 Json.Serialize ()
Mohammed Noureldin

131

답변 내용

1) .cshtml파일 에서 Javascript / Jquery 코드 블록으로 모델 데이터에 액세스하는 방법

2) .js파일 에서 Javascript / Jquery 코드 블록으로 모델 데이터에 액세스하는 방법

.cshtml파일 에서 Javascript / Jquery 코드 블록으로 모델 데이터에 액세스하는 방법

ModelJavaScript 변수에 대한 두 가지 유형의 c # 변수 ( )가 있습니다.

  1. 속성 할당 - 기본 데이터 유형이 좋아하는 int, string, DateTime(예 : Model.Name)
  2. 객체 할당 -사용자 정의 또는 내장 클래스 (예 : Model, Model.UserSettingsObj)

이 두 과제의 세부 사항을 살펴 보겠습니다.

나머지 답변은 아래 AppUser모델을 예로 들어 보겠습니다.

public class AppUser
{
    public string Name { get; set; }
    public bool IsAuthenticated { get; set; }
    public DateTime LoginDateTime { get; set; }
    public int Age { get; set; }
    public string UserIconHTML { get; set; }
}

이 모델에 할당 한 값은

AppUser appUser = new AppUser
{
    Name = "Raj",
    IsAuthenticated = true,
    LoginDateTime = DateTime.Now,
    Age = 26,
    UserIconHTML = "<i class='fa fa-users'></i>"
};

부동산 할당

할당에 다른 구문을 사용하고 결과를 관찰 할 수 있습니다.

1) 속성 할당을 따옴표로 묶지 않고.

var Name = @Model.Name;  
var Age = @Model.Age;
var LoginTime = @Model.LoginDateTime; 
var IsAuthenticated = @Model.IsAuthenticated;   
var IconHtml = @Model.UserIconHTML;  

여기에 이미지 설명을 입력하십시오

당신이 볼 수 있듯이 오류의 부부가, Raj그리고 True그들이 그 존재 해달라고하기 때문에 자바 스크립트 변수로 간주되어 variable undefined오류가 발생했습니다. dateTime varialble 오류는 unexpected number숫자에 특수 문자를 사용할 수 없다는 점에서 HTML 태그는 엔티티 이름으로 변환되어 브라우저가 값과 HTML 마크 업을 혼합하지 않습니다.

2) 따옴표로 묶는 속성 할당.

var Name = '@Model.Name';
var Age = '@Model.Age';
var LoginTime = '@Model.LoginDateTime';
var IsAuthenticated = '@Model.IsAuthenticated';
var IconHtml = '@Model.UserIconHTML'; 

여기에 이미지 설명을 입력하십시오

결과는 유효하므로 속성 할당을 따옴표로 묶으면 유효한 구문이 제공됩니다. 그러나 숫자 Age는 이제 문자열이므로 참고를 원하지 않으면 따옴표를 제거하면 숫자 유형으로 렌더링됩니다.

3)@Html.Raw 따옴표로 묶지 않고 사용

 var Name = @Html.Raw(Model.Name);
 var Age = @Html.Raw(Model.Age);
 var LoginTime = @Html.Raw(Model.LoginDateTime);
 var IsAuthenticated = @Html.Raw(Model.IsAuthenticated);
 var IconHtml = @Html.Raw(Model.UserIconHTML);

여기에 이미지 설명을 입력하십시오

결과는 테스트 사례 1과 비슷합니다. 그러나 문자열을 사용 @Html.Raw()하면 HTML약간의 변화가 나타났습니다. 엔티티 이름으로 변경하지 않고 HTML이 유지됩니다.

문서에서 Html.Raw ()

HTML 마크 업을 HTML 마크 업으로 해석하도록 HTML 태그를 HtmlString 인스턴스에 래핑합니다.

그러나 여전히 다른 줄에 오류가 있습니다.

4)@Html.Raw 인용 부호로 사용 및 포장

var Name ='@Html.Raw(Model.Name)';
var Age = '@Html.Raw(Model.Age)';
var LoginTime = '@Html.Raw(Model.LoginDateTime)';
var IsAuthenticated = '@Html.Raw(Model.IsAuthenticated)';
var IconHtml = '@Html.Raw(Model.UserIconHTML)';

여기에 이미지 설명을 입력하십시오

결과는 모든 유형에 적합합니다. 그러나 HTML이제 데이터가 손상되어 스크립트가 중단됩니다. 작은 따옴표 '를 사용 하여 데이터를 래핑하고 데이터에도 작은 따옴표가 있기 때문에 문제가 발생 합니다.

우리는 두 가지 접근 방식으로이 문제를 극복 할 수 있습니다.

1) 큰 따옴표 " "를 사용 하여 HTML 부분을 줄 바꿈하십시오. 내부 데이터에는 작은 따옴표 만 있습니다. (큰 따옴표로 묶은 후에 "는 데이터 내에 도 포함되어 있지 않아야 함 )

  var IconHtml = "@Html.Raw(Model.UserIconHTML)";

2) 서버 측 코드에서 문자 의미를 피하십시오. 처럼

  UserIconHTML = "<i class=\"fa fa-users\"></i>"

재산 할당의 결론

  • 숫자가 아닌 dataType에는 따옴표를 사용하십시오.
  • 숫자 dataType에 따옴표를 사용하지 마십시오.
  • Html.RawHTML 데이터를 그대로 해석하는 데 사용하십시오 .
  • HTML 데이터를 관리하여 서버 측에서 따옴표 의미를 이스케이프하거나 javascript 변수에 지정하는 동안 데이터와 다른 따옴표를 사용하십시오.

객체 할당

할당에 다른 구문을 사용하고 결과를 관찰 할 수 있습니다.

1) 객체 할당을 따옴표로 묶지 않습니다.

  var userObj = @Model; 

여기에 이미지 설명을 입력하십시오

ac # 객체를 javascript 변수에 할당하면 해당 객체의 값 .ToString()이 할당됩니다. 따라서 위의 결과입니다.

2 인용 부호로 객체 할당

var userObj = '@Model'; 

여기에 이미지 설명을 입력하십시오

3)Html.Raw 따옴표없이 사용 .

   var userObj = @Html.Raw(Model); 

여기에 이미지 설명을 입력하십시오

4)Html.Raw 따옴표와 함께 사용

   var userObj = '@Html.Raw(Model)'; 

여기에 이미지 설명을 입력하십시오

Html.Raw변수에 객체를 할당하는 동안 우리를 위해 더 많이 사용했다.

5)Json.Encode() 따옴표없이 사용

var userObj = @Json.Encode(Model); 

//result is like
var userObj = {&quot;Name&quot;:&quot;Raj&quot;,
               &quot;IsAuthenticated&quot;:true,
               &quot;LoginDateTime&quot;:&quot;\/Date(1482572875150)\/&quot;,
               &quot;Age&quot;:26,
               &quot;UserIconHTML&quot;:&quot;\u003ci class=\&quot;fa fa-users\&quot;\u003e\u003c/i\u003e&quot;
              };

우리는 약간의 변화를 보았습니다. 모델이 객체로 해석되는 것을 봅니다. 그러나 특수 문자가로 변경되었습니다 entity names. 또한 위의 구문을 따옴표로 묶는 것은별로 쓸모가 없습니다. 우리는 단순히 따옴표 안에 동일한 결과를 얻습니다.

Json.Encode () 의 문서에서

데이터 오브젝트를 JSON (JavaScript Object Notation) 형식의 문자열로 변환합니다.

entity Name속성 할당과 관련하여 이미이 문제 가 발생 했음을 기억하는 경우를 사용 하여이 문제를 극복했습니다 Html.Raw. 따라서 시도해보십시오. 결합 Html.Raw하고Json.Encode

6) 따옴표를 사용 Html.Raw하거나 사용 Json.Encode하지 않습니다.

var userObj = @Html.Raw(Json.Encode(Model));

결과는 유효한 Javascript 객체입니다

 var userObj = {"Name":"Raj",
     "IsAuthenticated":true,
     "LoginDateTime":"\/Date(1482573224421)\/",
     "Age":26,
     "UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
 };

여기에 이미지 설명을 입력하십시오

7) 사용 Html.RawJson.Encode따옴표 안에.

var userObj = '@Html.Raw(Json.Encode(Model))';

여기에 이미지 설명을 입력하십시오

따옴표로 줄 바꿈하면 JSON 데이터가 제공 됩니다.

객체 할당에 대한 결론

  • 자바 스크립트 변수에 자바 스크립트 객체 로 객체를 할당 하려면 Html.Raw및 조합 Json.Encode을 사용 합니다 .
  • JSON 을 얻기 위해 그것을 사용 Html.Raw하고 Json.Encode감싸십시오.quotes

참고 : DataTime 데이터 형식이 올바르지 않은 경우. 앞서 말했듯이 Converts a data object to a string that is in the JavaScript Object Notation (JSON) formatJSON에는 date유형이 포함되어 있지 않기 때문 입니다. 이 문제를 해결하는 다른 옵션은 javascipt Date () 객체를 사용하여이 유형 만 처리하도록 다른 코드 줄을 추가하는 것입니다.

var userObj.LoginDateTime = new Date('@Html.Raw(Model.LoginDateTime)'); 
//without Json.Encode


.js파일 에서 Javascript / Jquery 코드 블록으로 모델 데이터에 액세스하는 방법

면도기 구문은 .js파일 에서 의미가 없으므로 모델을 .js파일로 직접 사용할 수 없습니다 . 그러나 해결 방법이 있습니다.

1) 솔루션은 javascript 전역 변수를 사용하고 있습니다.

전역 범위의 javascipt 변수에 값을 할당 한 다음이 변수를 사용자 .cshtml.js파일 의 모든 코드 블록 내에서 사용해야 합니다. 문법은

<script type="text/javascript">
  var userObj = @Html.Raw(Json.Encode(Model)); //For javascript object
  var userJsonObj = '@Html.Raw(Json.Encode(Model))'; //For json data
</script>

대신에 우리는 변수를 사용할 수 있습니다이와 userObjuserJsonObj같은 필요할 때.

참고 : 유지 관리가 매우 어려워서 개인적으로 전역 변수를 사용하지 않는 것이 좋습니다. 그러나 다른 옵션이 없다면 적절한 이름 지정 규칙을 사용하여 사용할 수 있습니다 userAppDetails_global.

2) function () 또는 함수를 사용 closure 하여 모델 데이터에 의존하는 모든 코드를 래핑하십시오. 그런 다음 .cshtml파일 에서이 기능을 실행 하십시오.

external.js

 function userDataDependent(userObj){
  //.... related code
 }

.cshtml 파일

 <script type="text/javascript">
  userDataDependent(@Html.Raw(Json.Encode(Model))); //execute the function     
</script>

참고 : 위 스크립트 전에 외부 파일을 참조해야합니다. 그렇지 않으면 userDataDependent함수가 정의되지 않았습니다.

또한 함수도 전체 범위 내에 있어야합니다. 두 가지 솔루션 모두 글로벌 범위의 플레이어를 처리해야합니다.


Model 속성을 자바 스크립트로 업데이트하여 컨트롤러 액션 메서드로 보낼 수 있습니까?

@sortednoun 예 당신은 할 수 있습니다, 당신은 양식에서 수정 된 데이터를 다시 제출 할 수 있습니다, 또는 당신이 페이지를 다시로드하지 않으려면 다음 AJAX를 사용할 수 있습니다
Rajshekar Reddy

나는 아약스를 사용하지 않고 자바 스크립트에서 모델 속성을 수정하려고 시도했다. 그러나 양식을 제출할 때이 변경 사항은 모델에 반영되지 않았습니다. 나는 다음과 같은 일을하고 있었다 : var model = @ Html.Raw (Json.Encode (Model)); model.EventCommand = "업데이트 된 값"; 그것은 모델을 올바르게하고 값을 업데이트했지만 제출시 조치 방법에서 변경 사항이 누락되었습니다. (숨겨진 Html 컨트롤을 사용하여 동일한 작업을 수행하고 EventCommand에 바인딩하고 Javascript에서 값을 업데이트했지만 모델에 직접 적용 할 수 있는지 궁금하십니까?)

@sortednoun 당신의 요점을 얻었습니다 . 이것은 뷰에 전달하는 C # 모델과 관련이없는 javascript 객체var model = @Html.Raw(Json.Encode(Model));생성합니다 . 실제로 뷰가 렌더링 된 후에는 아무 것도 없습니다 . 따라서 UI의 양식은 자바 스크립트 객체 데이터 변경에 대한 단서가 없습니다. 이제 AJAX를 통해이 수정 된 전체 모델을 컨트롤러에 전달해야합니다. 또는 javascript를 사용하는 형식으로 입력 컨트롤의 값을 업데이트해야합니다. modelModel
Rajshekar Reddy 2012

Although I did the same thing using hidden Html control and bound it to EventCommand and updated it's value in javascript. But wondering if could do same directly to model?이 문장에 대해 .. EventCommand MVC에는 UIVC와 서버 액션 사이에 연결이있는 Webforms에는 없습니다. MVC에서는 모두 분리되어 있습니다. 당신이 컨트롤러와 상호 작용하기위한 유일한 방법은 AJAX 또는 양식을 통한 전송 or (도 다시로드) 새로운 페이지 요청
Rajshekar 레디

21

이것을 시도하십시오 : (작은 따옴표를 놓쳤습니다)

var floorplanSettings = '@Html.Raw(Json.Encode(Model.FloorPlanSettings))';

1
따옴표 @JuanPieterse는 당신에게 제공 JSONwihtout 시세가 당신을 제공합니다 javascript Object. 자세한 내용은 같은 스레드에서 내 대답을 확인하십시오. stackoverflow.com/a/41312348/2592042
Rajshekar Reddy

사실은 아닙니다. @danmbuen 솔루션이 제 경우에 효과가 있었고 문제가있어 작은 따옴표로 감싸는 것이 매력처럼 작동했습니다. 감사합니다.)
Dimitri

4

parens 주위에 모델 속성을 감싸는 것이 나를 위해 일했습니다. 세미콜론에 대해 불평하는 Visual Studio에서도 여전히 동일한 문제가 발생하지만 작동합니다.

var closedStatusId = @(Model.ClosedStatusId);

0

경우 : "ReferenceError가 모델이 정의되지 않은" 오류가 발생합니다, 당신은 다음과 같은 방법을 사용하여 시도 할 수 있습니다 :

$(document).ready(function () {

    @{  var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
         var json = serializer.Serialize(Model);
    }

    var model = @Html.Raw(json);
    if(model != null && @Html.Raw(json) != "undefined")
    {
        var id= model.Id;
        var mainFloorPlanId = model.MainFloorPlanId ;
        var imageDirectory = model.ImageDirectory ;
        var iconsDirectory = model.IconsDirectory ;
    }
});

도움이 되었기를 바랍니다...


0

너무 늦었지만이 솔루션은 .net 프레임 워크와 .net 코어 모두에 완벽하게 작동합니다.

@ System.Web.HttpUtility.JavaScriptStringEncode ()

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.