将数据从javascript传递到MVC控制器

时间:2015-06-21 10:22:50

标签: javascript asp.net-mvc asp.net-ajax vis.js

我有一个使用Vis.js库构建的树层次结构。我的项目是在asp.net MVC中。

树中的每个节点都有一个id。要求是当我点击任何节点时,应该将id传递给控制器​​,并且应该呈现与被调用的控制器动作方法相对应的视图。

我有一个显示树的视图如下: enter image description here

当我单击树中的任何节点(例如105)时,我希望将节点ID传递给控制器​​操作方法' Tree1'。方法Tree1将进行一些计算并呈现自己的视图。

[HttpPost]
public ActionResult Tree1(string a)
{
    return View();
}

要将id从我的树视图传递给Tree1控制器操作方法,我使用$ .ajax()。我在网上的各种论坛上找到了这个。

network.on('selectNode',function(properties)
    {
        $.post({url: '@Url.Action("Tree1")',a:properties.nodes.toString()});
                                    @*$.ajax({
                                        url: '@Url.Action("Tree1")',
                                        type: 'POST',
                                        data: {a:properties.nodes.toString()},
                                        success: function(result) {
                                         //process the results from the controller
                                        }
                                    });*@
                                }
                ); 

现在,这会将数据发送到方法Tree1(我可以在调试时看到),但是不会呈现Tree1的视图。而是渲染前一个视图本身,显示树。

我想将数据从javascript传递给控制器​​操作方法,这样就不会将响应发送回调用的javascript代码。网上的所有资料都建议将回复发送回调用javascript的解决方案。

你能帮我解决这个问题吗?我有什么基本概念吗?如何在没有被调用方法将响应发送回调用javascript的情况下将数据从javascript传递到控制器方法?

更新1

<script type="text/javascript">
    // create an array with nodes
    var nodes = new vis.DataSet([]);

        @foreach(DataRow @dr in Model.Tree.Tables[0].Rows)
        {
            @:nodes.add({id: @dr[0], label:@dr[0].ToString(), level:@dr[3]});
        }

    var edges = new vis.DataSet([]);
        @foreach(DataRow @dr in Model.Tree.Tables[0].Rows)
        {
            if(@dr[2].ToString()!="")
            {
                @:edges.add({from:@dr[2], to:@dr[0]});
            }
        }

    // create a network
    var container = document.getElementById('mynetwork');

    // provide the data in the vis format
    var data = {
        nodes: nodes,
        edges: edges
    };
    var options = {nodes:{shape:'ellipse'},edges:{arrows: 'to'},physics:true};

    // initialize your network!
    var network = new vis.Network(container, data, options);

    network.on('selectNode',function(properties)
    {

                                    $.ajax({
                                        url: '@Url.Action("Tree1")',
                                        type: 'POST',
                                        data: {a:properties.nodes.toString()},
                                        success: function(result) {
                                         //process the results from the controller
                                        }
                                    });
                                }
                );


</script>

2 个答案:

答案 0 :(得分:1)

在原始视图的HTML中,您应该有一个容器div,例如:

<div id="container">
... Original tree is here
<div id="container">

然后在成功回复中你必须把它放在这个容器中:

$.ajax({
    url: '@Url.Action("Tree1")',
    type: 'POST',
    data: {a:properties.nodes.toString()},
    success: function(result) {
        $("#container").html(result);
    }
});
编辑:我忘了你必须这样做才能返回部分视图

[HttpPost]
public ActionResult Tree1(string a)
{
    return PartialView();
}

答案 1 :(得分:1)

由于您想要导航到视图,您可以使用它:

network.on('selectNode',function(properties)
{
    var url = '@Url.Action("Tree1")' + '?a=' +properties.nodes.toString();
    document.location = url;
});