MVC / AJAX - 将当前的模型集合发送到控制器

时间:2014-09-09 11:02:53

标签: jquery asp.net-mvc asp.net-mvc-3 asp.net-ajax

在强类型列表视图中,我试图通过Ajax将当前数据(作为模型列表)传递给我的控制器,因此它可以用它做点什么。

我面临的问题是,我似乎无法将当前视图中的数据列表传递给我的控制器。使用没有参数的AJAX方法(但我需要使用参数,或者是否有其他方法可以向控制器提供所述信息?)。

我还尝试在构建视图时创建一个列表(测试),然后使用该变量作为参数,但显然在构造之后变量为空?

索引视图

@model IEnumerable<databaseModel.cbms>

@{
    ViewBag.Title = "Cbms Home";
    List<databaseModel.cbms> test = Model.ToList();
}

@Ajax.ActionLink("productId", "AJX_SortByProductId", new { cbmsModel = test }, new AjaxOptions()
                    {
                        HttpMethod = "GET",
                        UpdateTargetId = "divCbms",
                        InsertionMode = InsertionMode.Replace
                    })

控制器

public PartialViewResult AJX_SortByProductId(List<cbms> cbmsModel)
        {            
            //Retrieves the data
            List<cbms> model = cbms.SortByProductId();
            //Returns the partial view
            return PartialView("_Cbms", model);
        }

因此,当我进入控制器时,List cbmsModel为空,我不能将它用作参数。我可以传递一个没有问题的字符串,但我希望在我的视图中列出当前模型数据。

编辑:

以下也不起作用:

模型

@model IEnumerable<databaseModel.cbms>

@{
    ViewBag.Title = "Cbms Home";
    List<databaseModel.cbms> test = Model.ToList();  
    List<databaseModel.cbms> cbmsModel = new List<databaseModel.cbms>();    
    int i = 0;
    foreach (databaseModel.cbms value in test)
    {
        i++;
        TempData.Add(i.ToString(), value);
    }        
}


@Ajax.ActionLink("productId", "AJX_SortByProductId", new { cbmsModel = TempData.Values.ToList() }, new AjaxOptions()
               {
                   HttpMethod = "GET",
                   UpdateTargetId = "divCbms",
                   InsertionMode = InsertionMode.Replace
               })

这仍然导致参数为空。我真的不明白为什么......

2 个答案:

答案 0 :(得分:0)

我看到你使用Ajax.ActionLink,这很危险,因为它会生成一个link =&gt; HTTP请求GET和这些请求有限制:Get request limitations

如果你想发送&#34;复杂&#34;通过Ajax建模,我建议使用没有限制的POST请求。 我看到你没有表格,如果我理解得很好,你想要有一个显示信息的视图&amp;用于将这些信息发送到下一个操作的按钮。我能想到的唯一方法就是使用jquery ajax request&amp;在json中序列化对象。可以使用一些帮助程序或JSON.NET直接在视图中完成序列化,或者您可以在表中显示结果并使用javascript获取信息。

$.ajax({
url : ""AJX_SortByProductId/productId",
type: "POST",
data : formData, //the data you want to send
success: function(data, textStatus, jqXHR)
{
    //data - response from server
}

});

如果您仍想使用@ Ajax.ActionLink,则必须注意网址并查看模型是否已正确序列化,生成的html可以提供帮助。

答案 1 :(得分:0)

编辑:在您阅读答案之前,请参阅此答案下面的评论,因为此处提供的答案仅适用于特定情况,如果最多只有1位用户将与该网站连接。

我通过以下方式解决了这个问题。这是一种肮脏的方式,但可以解决问题。它将TempData传递给控制器​​,您只需在TempData中列出项目。

查看

@model IEnumerable

@{   
    ViewBag.Title = "Cbms Home";

    if (TempData != null)
    {
        TempData.Clear();
    }
    int i = 0;
    foreach (databaseModel.cbms value in Model.ToList())
    {
        i++;
        TempData.Add(i.ToString(), value);
    }    
}

<强>控制器

public PartialViewResult AJX_SortByProductId()
    {            
        //Retrieves the data
        List<object> viewDataList = TempData.Values.ToList();
        TempData.Clear();
        List<cbms> dataList = new List<cbms>();
        if (viewDataList != null)
        {
            foreach (cbms cbmsEntry in viewDataList)
            {
                dataList.Add(cbmsEntry);
            }
        }
        List<cbms> model = cbms.SortByProductId(dataList);

        //Returns the partial view
        return PartialView("_Cbms", model);
    }