2012-04-15 2 views
3

나는 둥근 모양을하고 해결책을 찾을 수 없으므로 여기에서 자신을 찾는다. 내가 읽은 것부터 asp.net 웹 폼에서 RegisterClientScript 또는 RegisterClientScriptBlock을 사용하여이 작업을 수행 할 수있었습니다. MVC3 설명서에서이 항목을 찾을 수 없습니다. 은 내가 MVC 3보기에서 다음과 같은 기능을 가지고 :MVC3의 컨트롤러에서 javascript 함수를 호출하는 방법

MYTEST보기 : 나는 다음과 같은 한 내 컨트롤러에서

<div data-role="content"> 

<div id="mappingTable"></div> 

</div> 

</section> 
@section Scripts { 
<script type="text/javascript"> 

    $("#jqm-home").live('pageinit', function() { 
     addTableRow(' adding data to table <br/>'); 
    }); 

    //I want to the able to call the function from the controller. 
    function addTableRow(msg) { 
     $('#mappingTable').append(msg);   
    }; 

    </script> 
} 

.

public class MyTestController : Controller 
    { 
     #region Class Constractor 

     public MyTestController() 
     {    
      Common.ControllerResourceEvent += new System.EventHandler<ResourceEventArgs>(Common_ResourceEvent); 
     } 

    private void Common_ResourceEvent(object sender, ResourceEventArgs e) 
    { 
     //I want to call the function addTableRow and pass ResourceEventArgs 
    } 

    #endregion Class Constractor  

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

클라이언트가 서버를 호출하도록 하시겠습니까? – McGarnagle

+0

당신은 무엇을하려고합니까? 버튼 클릭으로 서버를 호출하면 클라이언트가 호출됩니다. AJAX를 사용하여 서버를 호출하는 것이 아니라 콜백에서 함수를 호출 할 수 있습니다. – RPM1984

답변

9

컨트롤러에서 클라이언트 자바 스크립트를 실제로 "호출"할 수 없습니다. JS 코드를 페이지에 삽입하는 RegisterClientScript와 비슷한 것을하고 싶다면 꽤 쉽게 할 수 있습니다. 문자열 속성이있는 모델 (단순한 클래스 이상은 아닙니다)을 만들 수 있습니다. 속성 값을 삽입 할 클라이언트 측 JS 코드로 설정하십시오. 모델을 뷰에 전달하십시오.

public ActionResult Index() 
{ 
    ViewBag.JS = "addTableRow('My Message');"; 
    return View(); 
} 

// In the view: 
<script type="text/javascript"> 
    @ViewBag.JS 
: 당신이 모델을 생성하지 않으려면, 동적 객체 인 ViewBag를 통해 전달할 수,

public class SampleModel 
{ 
    public string JS { get; set; } 
} 

public ActionResult Index() 
{ 
    var model = new SampleModel(); 
    model.JS = "addTableRow('My Message');"; 
    return View(model); 
} 

// In the view (at the top - note the cast of "model" and "Model" 
@model Namespace.SampleModel 
// Then your script 
<script type="text/javascript"> 
    @Model.JS 

을 또는이 같은 것을 - 당신의보기에서 속성을 참조

+1

'@ ViewBag.JS'가 구문 오류를 일으킬 수 있습니다. 그렇다면'@ Html.Raw (ViewBag.JS)' – oHoodie

0

나는 틀린 각에서 여기에서 것오고있다지도 모른다고 생각한다. 컨트롤러에서 직접 자바 스크립트를 호출 할 수 없습니다. 다른 방법으로 만 할 수 있습니다. 예를 들어 자바 스크립트에서 컨트롤러 메소드를 호출하고 아약스를 사용하면이 작업을 수행하는 데 도움이되는 여러 jquery 아약스 함수가 ​​있습니다. 웹 페이지에서

: 컨트롤러

$.post('TestController/TestGetPartialView','{param1:"string to add"}', function (data) { 

    ('#mappingTable').append(data); // this adds the string to the mapping table. 

},'html'); 

:

[HttpPost] 
public PartialViewResult TestGetPartialView(string param1) 
{ 
    return PartialView("TestPartial", param1); 
} 

에서 가장 유용한 하나 인 $의 .post()는

내가 가장 자주 사용하는 패턴은 다음과 같다 부분보기 :

@model string 
<p> Model </p> 

이것은 페이지의 문자열을 컨트롤러로 다시 전달하고, 부분보기에서 다시 페이지로 전달합니다. 이것은 정확히 당신이하고 싶은 것은 아니지만, 아약스와 부분 뷰를 사용하여 데이터를 전달하는 방법의 예입니다. JavaScriptModel와

2

(http://jsm.codeplex.com) 당신이 그것을 다음과 같은 방법을 할 수있는 :

public ActionResult Index() 
{ 
    this.AddJavaScriptFunction("addTableRow", "My Message"); 
    return View(); 
} 

당신이 함수와의 js 파일을 만들고 JS 변수에 목록으로 테이블을 추가하면 그것은 더 나은 것입니다. 그러면 js 함수가 목록을 반복하여 테이블을 추가합니다.

public ActionResult Index() 
{ 
    this.AddJavaScriptVariable("TableListInJavaScript", tableList); 
    this.AddJavaScriptFunction("MyTableReadyFunction"); 
    return View(); 
} 
관련 문제