2012-05-04 42 views
0

我有一个MVC3的操作方法有3个参数是这样的:调用MVC操作方法,通过JavaScript,但不使用AJAX

var url = "/Question/Insert?" + "_strTitle='" + title + "'&_strContent='" + content + "'&_listTags='" + listTags.toString() + "'"; 

,我想通过正常的JavaScript函数不是AJAX调用这个(因为它是没有必要使用AJAX功能) 我试图用这个功能,但它没有工作:

window.location.assign(url); 

它并没有跳到插入QuestionController的作用。

有人想帮我吗?非常感谢

这是更详细

我要插入新问题的数据库,但我必须从CKEDITOR获取数据,所以我必须使用下面这个函数来获取和验证数据

// insert new question 
$("#btnDangCauHoi").click(function() { 
    //validate input data 
    //chủ đề câu hỏi 
    var title = $("#txtTitle").val(); 

    if (title == "") { 
     alert("bạn chưa nhập chủ đề câu hỏi"); 
     return; 
    } 
    //nội dung câu hỏi 
    var content = GetContents(); 
    content = "xyz"; 
    if (content == "") { 
     alert("bạn chưa nhập nội dung câu hỏi"); 
     return; 
    } 
    //danh sách Tag 
    var listTags = new Array(); 
    var Tags = $("#list_tag").children(); 

    if (Tags.length == 0) { 
     alert("bạn chưa chọn tag cho câu hỏi"); 
     return; 
    } 

    for (var i = 0; i < Tags.length; i++) { 
     var id = Tags[i].id; 
     listTags[i] = id; 
     //var e = listTags[i]; 
    } 
    var data = { 
     "_strTitle": title, 
     "_strContent": content, 
     "_listTags": listTags.toString() 
    }; 
    //  $.post(url, data, function (result) { 
    //   alert(result); 
    //  }); 
    var url = "/Question/Insert?" + "_strTitle='" + title + "'&_strContent='" + content + "'&_listTags='" + listTags.toString() + "'"; 
    window.location.assign(url); // I try to use this, and window.location also but they're not working 
}); 

此网址拨打MVC行动由POST方法

[HttpPost] 
    [ValidateInput(false)] 
    public ActionResult Insert(string _strTitle, string _strContent, string _listTags) 
    { 

     try 
     { 
      //some code here 
     } 
     catch(Exception ex) 
     { 
      //if some error come up 
      ViewBag.Message = ex.Message; 
      return View("Error"); 
     } 
     // if insert new question success 
     return RedirectToAction("Index","Question"); 
    } 

“插入” 下面如果插入成功的行动,它将[R直接转到索引页面列出所有包含新问题的问题已插入。如果没有,它会显示错误页面。所以,这就是我不使用AJAX的原因

有没有人帮助我?谢谢:)

+0

为什么你不想使用AJAX? – jrummell

+0

您是否收到错误或页面是否无法导航?你的控制器是一个POST还是GET? – Terry

+0

也许你可以给我们你的路线和行动方法的语法? window.location应该工作,除非你的路由不正确。你有什么错误吗? – Ronald

回答

2

尝试:

window.location = yourUrl; 

此外,尝试使用Fiddler或一些其他类似的工具来查看重定向是否发生。

编辑:

你动作期待一个HTTP POST方法,但使用了window.location会导致GET方法。这就是为什么你的行为从未被调用过的原因。

[HttpPost] 
[ValidateInput(false)] 
public ActionResult Insert(string _strTitle, string _strContent, string _listTags) 
{ 
    // Your code 
} 

要么改为HttpGet(你不应该)或者使用jQuery或其他支持Ajax的库来执行POST。你不应该使用GET方法来更新数据。它会给你造成很多安全问题,以至于在解决问题时你不知道从哪里开始。

考虑到您已经在使用jQuery,您可能会一路走下来并使用Ajax。使用$.post()方法执行HTTP POST操作。

在$ .post()的回调函数中,您可以在末尾return false以防止重定向到错误或索引视图。

$.post("your_url", function() { 
    // Do something 

    return false; // prevents redirection 
}); 

就是这样。

+0

与'window.location.assign()'完全一样的东西' –

+0

这是真的,但我曾经遇到过一个版本的Chrome的问题,其中.assign无法正常工作,但window.location非常好。我从来没有想过为什么,因为我不想打扰太多。我得到了最终结果与windows.location =“url” –

+0

哦,真的吗?足够公平的说,'window.location'的使用方式越来越广泛。 –

0

,如果你想避免使用AJAX你可以使用iframe,但我会建议使用AJAX

<iframe src="" id="loader"></iframe> 
<script> 
document.getElementById("loader").src = url; 
</script> 
+0

为什么有人会在实际达到预期结果时投票回答此问题? – Bloafer

1

你可以试着改变

var url = "/Question/Insert?" + "_strTitle='" + title + "'&_strContent='" + content + "'&_listTags='" + listTags.toString() + "'"; 

var url = "/Question/Insert?_strTitle=" + title + "&_strContent=" + content + "&_listTags=" + listTags.toString(); 

因为我们并未要求他们我已经删除了单引号。

没有看到你的php代码,虽然不容易找出问题所在。

当你说“它没有跳转到QuestionController的Insert操作”。你的意思是浏览器没有加载该页面,或者当URL加载时它没有路由到预期的控制器/操作?

+0

我的意思是它没有路由到预期的控制器/操作。有没有一些建议,@Jimbo? –

+0

我会说这对您的客户端脚本没有问题,如果url正在被浏览器加载,但您的serverside应用程序没有正确路由,它必须与URL格式化有关。 你可以尝试的URL的一部分插入后添加斜线: '/问题/插入/ _ strTitle =' 这在我的经验,在一些MVC框架过去造成的问题? 我希望这有些帮助。 – Jimbo