MVC - 来自Controller的推文不能很好地运行

时间:2014-08-18 09:28:16

标签: c# asp.net-mvc twitter

我的应用程序中的Twitter推文有问题,我不明白为什么不工作。

这是我的代码:

TwitterHelper.Tweet(Message, Request,
     unitOfWork.UserProfileRepository.GetByID(WebSecurity.CurrentUserId).ToString());

如果我使用Controller的ActionResult Index...方法或编辑方法中的代码,正常工作。

但如果我使用自己的

ActionResult SendTweet(string message) 
{
    ...

它不起作用。没有错误信息,只是没有到达推特,不想进行身份验证等。

我用ajax

从我的视图中调用此方法
$.ajax({
    url: "/MyController/SendTweet",
    type: "POST",
    dataType: "json",
    data: { Message: $('#Message').val()},
    success: function (data) { $('#Message').text = ''; }
});

如果我调试我的控制器,我有消息值并通过调用,没有异常,但没有工作。

更新 在Twitter身份验证之后使用Request参数。发生了什么:如果我打电话给索引,例如:

if(userName != TwitterHelper._userName) 
{ 
    TwitterHelper._userName = userName; 
    TwitterHelper._accessToken = null;  
    TwitterHelper._accessTokenSecret = null; 
    TwitterHelper._userId = null; 
    TwitterHelper._screenName = null; 
}

之后:

SortedDictionary<string, string> requestTokenParams = 
    new SortedDictionary<string, string>(); 

requestTokenParams.Add("oauth_callback", HttpContext.Current.Request.Url.AbsoluteUri); 

var tokenResponse = 
    TwitterHelper.GetToken("api.twitter.com/oauth/request_token";, requestTokenParams); 

NameValueCollection qscoll = HttpUtility.ParseQueryString(tokenResponse); 

var loginUrl = "api.twitter.com/oauth/authenticate?oauth_token="; 
    + qscoll["oauth_token"];

和:

//(HERE THE BROWSER SHOWS THE TWITTER LOGIN) –
HttpContext.Current.Response.Redirect(loginUrl);   

如果我从SendTweet方法调用Tweet,方式是一样的。但是在这里:HttpContext.Current.Response.Redirect(loginUrl);没有显示任何内容,也没有登录页面。什么都没发生

你可以帮忙吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您无法Redirect来电AJAX。 (嗯......基本上)

该行:

HttpContext.Current.Response.Redirect(loginUrl);

因为您正在执行异步发布而无效。

以下是它的工作原理:

使用:

$.ajax({
    url: "/MyController/SendTweet",
    type: "POST",
    dataType: "json",
    data: { Message: $('#Message').val()},
    success: function (data) { $('#Message').text = ''; }
});

您的浏览器正在请求与您的服务器进行异步连接,并且将等待数据到达。如果此数据包含Redirect,则在此上下文中这不是真正有效的指令。它只是等待数据,而不是指令。

如何修复:

ActionResult SendTweet(string message)适合json

[HttpPost]
public JsonResult SendTweet(string message)
{
    bool isAuthenticationRequired = //detect wether a user needs to login

    if (isAuthenticationRequired)
    {
        //returns indicator that login is required
        return Json(new { result = "unauthenticated" }, JsonRequestBehavior.AllowGet);
    }

    //do normal stuff

    return Json(new { result = "tweet send!" }, JsonRequestBehavior.AllowGet);
}

然后,更新您的ajax电话以处理结果:

$.ajax({
    url: "/MyController/SendTweet",
    type: "POST",
    dataType: "json",
    data: { Message: $('#Message').val()},
    success: function (data) { 

        if (data.result == "unauthenticated"){
            location.href = "an action which will redirect to the login page";
            return;
        }            

        $('#Message').text = ''; }
});

也许location.href需要一些额外的参数才能重新发布数据,但现在看来已经足够了。

<强>更新

我对Twitter API并不是很熟悉,但要重定向到正确的页面,您需要一个正常的ActionResult,可能是Ajax调用的Twitter API。您可以向网址添加一些参数,或者requestTokenParams.Add("oauth_callback", HttpContext.Current.Request.Url.AbsoluteUri); 可能会提供此类功能。

要重定向回正确的页面,请查看:

HttpContext.Current.Request.Url.AbsoluteUri 

SendTweet

会再次向您发送json操作,但由于这是post requestTokenParams.Add("oauth_callback", HttpContext.Current.Request.Url.AbsoluteUri); 操作,因此无法找到它。

您需要更改

ajax

到具有requestTokenParams.Add("oauth_callback", "someactionresult?tweetmessage=" + message); 调用的页面或执行此操作的其他页面,然后重定向到原始页面。您还可以添加一些参数来重新发送推文消息。像这样:

public ActionResult someactionresult (string tweetmessage)
{
    //do twitter stuff
    return RedirectToAction("your original url");
}

采取行动:

{{1}}