4

我环顾四周,找不到解决方案,因此我发现自己在这里。根据我的阅读,我可以使用 RegisterClientScript 或 RegisterClientScriptBlock 在 asp.net Web 表单中执行此操作。我在任何 MVC3 文档中都找不到这个。我在 MVC 3 视图中具有以下功能:

我的测试视图:

<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();
    }
}
4

3 回答 3

10

您不能真正从控制器“调用”客户端 Javascript。你可以做什么,假设你想做一些类似于 RegisterClientScript 的事情,将 JS 代码注入你的页面,可以很容易地完成。您可以创建一个具有字符串属性的模型(只不过是一个简单的类)。将属性值设置为要注入的客户端 JS 代码。将模型传递给视图。在您的视图中,引用该属性 - 如下所示:

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

或者,如果您不想创建模型,可以通过 ViewBag 传递它,它是一个动态对象:

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

// In the view:
<script type="text/javascript">
   @ViewBag.JS
于 2012-04-15T22:31:54.560 回答
2

使用 JavaScriptModel ( 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();
}
于 2013-01-08T12:01:45.273 回答
0

我认为你可能从错误的角度来这里。您不能直接从控制器调用页面上的 javascript。你只能做相反的事情,即从javascript调用控制器方法,使用ajax,有几个jquery ajax函数可以帮助你做到这一点。最有用的是 $.post()

我最常使用的模式如下:

在网页中:

$.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);
}

部分观点:

@model string
<p> Model </p>

这会将一个字符串从页面传递回控制器,然后传递到局部视图,然后再传递回页面。这可能不是您想要做的,但它是如何使用 ajax 和部分视图传递数据的示例,我认为这可能会对您有所帮助。

于 2012-04-15T23:07:18.617 回答