0

我有一个带有 3 个参数的 MVC3 操作方法,如下所示:

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

此 URL 通过 POST 方法调用下面的 MVC 操作“插入”

    [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");
    }

如果插入操作成功,它将重定向到列出所有问题的索引页面,包括已插入的新问题。如果没有,它将显示错误页面。所以,这就是我不使用 AJAX 的原因

有人帮我吗?谢谢 :)

4

3 回答 3

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

就是这样。

于 2012-05-04T14:34:43.817 回答
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 的插入操作”时。你的意思是浏览器没有加载那个页面,或者当 url 被加载时它没有路由到预期的控制器/动作?

于 2012-05-04T14:37:19.103 回答
0

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

<iframe src="" id="loader"></iframe>
<script>
document.getElementById("loader").src = url;
</script>
于 2012-05-04T14:32:21.430 回答