最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

asp.net mvc 3 - Call MVC action method by javascript but not using AJAX - Stack Overflow

programmeradmin0浏览0评论

I have a MVC3 action method with 3 parameters like this:

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

and I want to call this by normal javascript function not AJAX (because it's not necessary to use AJAX function) I tried to use this function but it didn't work:

window.location.assign(url);

It didn't jump to Insert action of QuestionController.

Is there someone would like to help me? Thanks a lot

This is more detail

I want to insert new Question to database, but I must get data from CKeditor, so I have to use this function below to get and validate data

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

This URL call MVC action "Insert" below by POST method

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

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

If insert action success, it will redirect to index page where listing all question include new question is already inserted. If not, it will show error page. So, that's reason I don't use AJAX

Is there some one help me? Thanks :)

I have a MVC3 action method with 3 parameters like this:

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

and I want to call this by normal javascript function not AJAX (because it's not necessary to use AJAX function) I tried to use this function but it didn't work:

window.location.assign(url);

It didn't jump to Insert action of QuestionController.

Is there someone would like to help me? Thanks a lot

This is more detail

I want to insert new Question to database, but I must get data from CKeditor, so I have to use this function below to get and validate data

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

This URL call MVC action "Insert" below by POST method

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

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

If insert action success, it will redirect to index page where listing all question include new question is already inserted. If not, it will show error page. So, that's reason I don't use AJAX

Is there some one help me? Thanks :)

Share Improve this question edited May 5, 2012 at 8:28 Abigail Vo asked May 4, 2012 at 14:30 Abigail VoAbigail Vo 1034 silver badges13 bronze badges 4
  • Why don't you want to use AJAX? – jrummell Commented May 4, 2012 at 14:33
  • Did you get an error or did the page just not navigate? Is your controller action a POST or GET? – Terry Commented May 4, 2012 at 14:36
  • Maybe you can give us the syntax of your Route and Action method? The window.location should work, unless your routing is not correct. Do you get any errors. – Ronald Commented May 4, 2012 at 14:43
  • What kind of result does your controller method return? If it's not HTML content type, the browser might react funky when you try anything that's not an out-of-band call. – Rich Commented May 4, 2012 at 14:49
Add a ment  | 

3 Answers 3

Reset to default 2

Try:

window.location = yourUrl;

Also, try and use Fiddler or some other similar tool to see whether the redirection takes place.

EDIT:

You action is expecting an HTTP POST method, but using window.location will cause GET method. That is the reason why your action is never called.

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

Either change to HttpGet (which you should not) or use jQuery or other library that support Ajax in order to perform POST. You should not use GET method to update data. It will cause so many security problems for your that you would not know where to start with when tackling the problem.

Considering that you are already using jQuery, you might as well go all the way and use Ajax. Use $.post() method to perform HTTP POST operation.

Inside a callback function of the $.post() you can return false at the end in order to prevent redirection to Error or Index views.

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

    return false; // prevents redirection
});

That's about it.

You could try changing

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

to

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

I've removed the single quotes as they're not required.

Without seeing your php code though it's not easy to work out where the problem is.

When you say "It didn't jump to Insert action of QuestionController." do you mean that the browser didn't load that page or that when the url was loaded it didn't route to the expected controller/action?

You could use an iframe if you want to avoid using AJAX, but I would remend using AJAX

<iframe src="" id="loader"></iframe>
<script>
document.getElementById("loader").src = url;
</script>
发布评论

评论列表(0)

  1. 暂无评论