0

我是 asp.net mvc 的新手。

我有一个页面,最初有一个链接,该链接将使用 javascript 弹出一个窗口,允许他们登录到他们的 facebook 页面。

这很好,但现在我需要在弹出窗口之前更新我们数据库中的一些数据。我添加了一个在用户单击链接时调用的方法(不返回任何内容)。在控制器方法中,我更新了我的数据库,然后什么也不返回(也就是说,没有返回任何视图。)只要代码返回,原始的 javascript 就会触发并打开 facebook 窗口。

这种方法适用于 IE,但 javascript 不会在 chrome 或 firefox 中触发。我究竟做错了什么?

这是原始代码:

    <a onclick="ShareFacebook('@Model.ShareFacebookTitle', '@Model.ShareFacebookBody');" class="facebook"  target="_blank">
        <img src="/Content/images/socialMediaIcons/facebookIcon.png" alt="Add to Facebook" onmouseover="this.src='/Content/images/socialMediaIcons/colorFacebookIcon.png'"
           onmouseout="this.src='/Content/images/socialMediaIcons/greyFacebookIcon.png'" /></a>

这适用于所有 3 个浏览器。

然后我将代码更改为如下所示:

    @Ajax.ImageActionLink("/Content/images/socialMediaIcons/facebookIcon.png", "facebook", "/Content/images/socialMediaIcons/colorFacebookIcon.png", "/Content/images/socialMediaIcons/greyFacebookIcon.png",
        "ShareViaFacebook", "ContactUs",
        new { ... paremeters not relevant here },
        new AjaxOptions
        {
            HttpMethod = "POST",
            InsertionMode = InsertionMode.Replace,
            UpdateTargetId = "content-dialog",
            OnComplete = "ShareFacebook('@Model.ShareFacebookTitle', '@Model.ShareFacebookBody');"
        }, null)

并添加了一个控制器方法:

    public void ShareViaFacebook(... parameters not relevant here)
    {
        //do database update
    }

基本上,我将 ShareFacebook javascript 方法从原始代码中的 onclick 事件移动到修改后的代码中的 OnComplete 事件。如前所述,这在 IE 中运行良好,但在 Chrome 和 Firefox 中,OnComplete 事件永远不会触发。

Chrome 和 Firefox 不会触发此事件是否有原因,我可以做些什么来让它触发吗?我尝试使用 OnSuccess 事件,但这也不会触发。我还尝试更改 ShareViaFacebook 签名以返回 ActionResult,然后在代码中返回 new EmptyResult()。那也没有解决它。返回空视图 (View()) 或部分视图 (PartialView()) 也不起作用。

4

1 回答 1

0

好的,

编辑

我重读了您的问题,虽然我认为下面的解决方案是一个很好的解决方案,但您可能没有得到 onSuccess 或 onComplete 触发的原因是因为我不确定它们会在没有实际响应的情况下触发。

您应该设置 .NET 操作以在完成后返回某些内容。请参阅下面的示例,了解如何使用 JsonResult 执行此操作。

结束编辑

首先,我看到您尝试使用 MVC razor 标记做什么,尽管我非常喜欢 MVC 助手,但我建议您不要使用它们,而是使用 jQuery ajax 调用。MVC Helpers 工作正常,但我觉得比它的 jQuery 版本更难使用。

这是我将如何做这样的事情(我把它简化为更简单的东西,希望它不会太混乱

1)创建img标签

<img id='img-id' src='ImageUrl' class='foo' />

2) 使用 jQuery 创建绑定

<script type='text/javascript'>
    $('#img-id').click(function(){
        launchFacebookToDotNet();
    });
</script>

3) 创建 lanchFacebookToDotNet 函数

<script type='text/javascript'>
// use jQuery Ajax call and promise pattern to finish calls
var launchFacebookToDotNot = function(){

// make the request
    var request = $.ajax({
        url : '@Url.Action("ActionName","ControllerName"),
        type : 'POST', // or 'GET', get is by default
        data : {
            paramName1 : 'paramValue1',
            paramName2 : 'paramValue2'
        } //etc
    });

    //when done and successful
    request.success(function(){
        ShareFacebook('@Model.ShareFacebookTitle', '@Model.ShareFacebookBody');
    });

    //when error
    request.error(function(){
        alert('there was a server error');
    });
};
</script>

您还应该从 .net 控制器返回一个 JsonResult 以防出现已处理的错误,或者如果您想自定义您的响应

会是这样的

 public JsonResult ActionName(){

     // code here to make something awesome happen
     return new JsonResult(new {success = true, message = "I am Json, hear me roar.");
 }

ajax调用中的响应可以这样处理

 // using ajax success example from above

 request.success(function(response){ // the response will be passed in automatically as JSON
     // always do error and value checking but I am skipping it due to time

     if (response.success === true){
          ShareFacebook('@Model.ShareFacebookTitle', '@Model.ShareFacebookBody');
     } else {
          alert(response.message);
     }

    });

希望这可以帮助!

于 2013-04-12T18:58:22.030 回答