从MVC控制器操作调用javascript

时间:2010-04-25 21:08:06

标签: javascript asp.net-mvc

我可以从 MVC控制器操作(而不是从视图页面)调用javascript函数并获取返回值吗?怎么样?


我需要使用javascript(例如,但这是aspx页面)向代码(.cs)的服务器发出请求

function getInitData() { 
var code; code = 'return {' ;
code += 'me: API.getProfiles({uids: API.getVariable({key: 1280}), fields: "photo"})[0]'; 
code += '};'
VK.Api.call('execute', { 'code': code }, onGetInitData); 
} 

9 个答案:

答案 0 :(得分:14)

对于刚刚使用标准表单提交(非AJAX)的人,可以在完成操作后触发一些Javascript / JQuery代码。

首先,在Model上创建一个字符串属性。

public class MyModel 
{
    public string JavascriptToRun { get; set;}
}

现在,在视图的Javascript中绑定到您的新模型属性:

<script type="text/javascript">
     @Model.JavascriptToRun
</script>

现在,在您的视图中,创建一个Javascript函数,它可以执行您需要执行的操作:

<script type="text/javascript">
     @Model.JavascriptToRun

     function ShowErrorPopup() {
          alert('Sorry, we could not process your order.');
     }

</script>

最后,在你的控制器动作中,你需要调用这个新的Javascript函数:

[HttpPost]
public ActionResult PurchaseCart(MyModel model)
{
    // Do something useful
    ...

    if (success == false)
    {
        model.JavascriptToRun= "ShowErrorPopup()";
        return View(model);
    }
    else
        return RedirectToAction("Success");
}

答案 1 :(得分:12)

您可以从JavaScript函数调用控制器操作,但反之亦然。服务器如何知道要定位的客户端?服务器只响应请求。

在发送给客户端的响应中从JavaScript调用控制器操作(使用jQuery JavaScript库)的示例。

$.ajax({
           type: "POST",
           url: "/Controller/Action", // the URL of the controller action method
           data: null, // optional data
           success: function(result) {
                // do something with result
           },                
           error : function(req, status, error) {
                // do something with error   
           }
       });

答案 2 :(得分:10)

是的,绝对可以使用Javascript Result:

return JavaScript("Callback()");

您的观点应引用Javascript:

function Callback(){
    // do something where you can call an action method in controller to pass some data via AJAX() request
}

答案 3 :(得分:2)

这是迟到的答案,但对其他人有用。 在视图中使用ViewBag如下:

@Html.Raw("<script>" + ViewBag.DynamicScripts + "</script>")

然后从控制器设置此ViewBag如下:

ViewBag.DynamicScripts = "javascriptFun()";

这将执行JavaScript函数。 但是如果它是ajax调用,则不会执行此函数。 要从ajax回调中调用JavaScript函数,从控制器返回两个值,并在ajax回调中写入成功函数,如下所示:

$.ajax({
       type: "POST",
       url: "/Controller/Action", // the URL of the controller action method
       data: null, // optional data
       success: function(result) {
            // do something with result
       },
     success: function(result, para) {
        if(para == 'something'){
            //run JavaScript function
        }
      },                
       error : function(req, status, error) {
            // do something with error   
       }
   });
从控制器

您可以返回两个值,如下所示:

return Json(new { json = jr.Data, value2 = "value2" });

答案 4 :(得分:1)

您可以通过让控制器返回一段数据来模仿这一点,然后您的视图可以转换为JavaScript调用。

我们这样做是为了让人们使用RESTful URL来共享他们的jquery渲染工作区视图。

在我们的例子中,我们传递一个需要渲染的组件列表,并使用Razor将它们转换回jquery调用。

答案 5 :(得分:1)

如果我正确理解了这个问题,您希望在控制器中使用JavaScript代码。 (你的问题很清楚,但投票和接受的答案都引起了一些疑问) 所以:你可以通过使用.NET的System.Windows.Forms.WebBrowser控件执行javascript代码,以及浏览器可以执行的所有操作。它需要引用System.Windows.Forms,并且交互在某种程度上是旧学校#34;。 E.g:

void webBrowser1_DocumentCompleted(object sender, 
    WebBrowserDocumentCompletedEventArgs e)
{
    HtmlElement search = webBrowser1.Document.GetElementById("searchInput");
    if(search != null)
    {
        search.SetAttribute("value", "Superman");
        foreach(HtmlElement ele in search.Parent.Children)
        {
            if (ele.TagName.ToLower() == "input" && ele.Name.ToLower() == "go")
            {
                ele.InvokeMember("click");
                break;
            }
        }
    }
}

现在可能,这不是最简单的解决方案。

另一种选择是使用Javascript .NETjint根据具体情况运行javasctipt或其他解决方案。

有关此主题的一些相关问题或可能的重复:

Embedding JavaScript engine into .NET

Load a DOM and Execute javascript, server side, with .Net

希望这有帮助。

答案 6 :(得分:0)

MVC中的常用/标准方式是你应该在视图中放置/调用你的所有显示,UI,CSS和Javascript,但是没有规则,你可以在Controller中调用它如果你设法这样做(我没有看到可能性)。

答案 7 :(得分:0)

由于您的控制器操作在服务器上执行,并且JavaScript(通常)在客户端(浏览器)上执行,因此这没有意义。如果在页面加载到浏览器后默认情况下需要执行某些操作,则可以使用JavaScript的document.OnLoad事件处理程序。

答案 8 :(得分:0)

<script>
    $(document).ready(function () {
        var msg = '@ViewBag.ErrorMessage'
        if (msg.length > 0)
            OnFailure('Register', msg);
    });

    function OnSuccess(header,Message) {
        $("#Message_Header").text(header);
        $("#Message_Text").text(Message);
        $('#MessageDialog').modal('show');
    }

    function OnFailure(header,error)
    {
        $("#Message_Header").text(header);
        $("#Message_Text").text(error);
        $('#MessageDialog').modal('show');
    }
</script>