2011-06-02 24 views
1

我有全面的搜索,可以返回多个对象列表。每个这样的列表都由包含附加列表的对象组成。处理器负载方面的搜索非常复杂。如何将视图中的对象列表传递给asp.net中的控制器动作mvc3

一旦我有结果,我通过局部视图显示原始对象。

public ActionResult BeginSearch(SearchHomeVM searchParameters) 
     { 
     var search = new Search(searchParameters); 
     linije = search.PretraziLinije(); 

     return PartialView("_searchResult", linije); 
     } 

然后以这种形式,我希望通过AJAX调用显示特定项目的细节。问题是我需要使用对象数据,而不是在数据库中运行其他搜索。 在剃刀我有:

@model LinijeSearchResult 
    @if (Model.BrojDirektnihLinija > 0) 
    { 
    <table id="direktneLinije" class="InvisibleTable"> 
    <thead> 
     <tr> 
      <th> 
       Direktne linije 
      </th> 
      <th> 
      </th> 
     </tr> 
    </thead> 
    @for (int index = 0; index < Model.DirektneLinije.Count; index++) 
    { 
     LinijaSM item = Model.DirektneLinije[index]; 
     List<LinijaSM> lin = new List<LinijaSM> { item }; 
     <tr> 
      <td>@item.Naziv 
      </td> 
      <td> 
       @using (Ajax.BeginForm("RenderStanice", 
        new { psd = 0, index = index, lin = lin }, 
        new AjaxOptions 
        { 
         HttpMethod = "POST", 
         UpdateTargetId = "staniceLinije", 
         InsertionMode = InsertionMode.Replace 
        })) 
       { 
        <input type="submit" value="Stanice" /> 
       } 
      </td> 
     </tr> 
    } 
    </table> 

    } 
    else 
    { 
    <text>Nema direktnih linija za odabrane parametre.</text> 
    <br /> 
    } 

在这里你可以看到我是多么想将数据传递给控制器​​动作,看起来像这样:

public ActionResult RenderStanice(List<LinijaSM> lin) 
    { 
     return PartialView("_staniceSR", lin); 
    } 

在该控制器的动作我得到空列表。 可以请你就如何完成这一建议。

< <编辑>>

到现在为止我已经想通了,任何对象的列表不能回传给控制器。对于复杂的对象也是如此。我可以传递一个整数,但不是整数列表。

有人能告诉我如何完成我的目标吗? 我需要将对象列表传递回控制器。它可以通过将其添加到上下文,创建新的viewData或类似的东西来完成?

如果这是不可能的,可以通过AJAX呈现局部视图,但是没有控制器操作?

回答

1

你似乎应该在For循环之外定义你的列表,然后在循环中添加它。否则,你将每次都定义一个新列表,并且只能得到列表看起来像从最后一次通过的列表,因为这可能是空的,因此是你的空列表。

更新:但......更重要的是,在将其传递到局部视图之前,您应该在控制器中构建一个视图就绪的对象。在视图中使用Razor来制作这个对象并不是很好的分离问题。使视图模型发送到包含该列表的完整视图,然后将该列表传递给您的局部视图。

+0

我有我的视图模型中的完整列表,问题是,我不知道如何将它传递回控制器。我可以通过它,没有问题,我的部分观点。但我需要将它传递回控制器,所以我可以使用AJAX渲染局部视图。 – Zaak 2011-06-03 04:07:10

+0

我将它作为JSON传递给任何控制器将为您的AJAX响应生成内容。 – Mobius 2011-06-09 22:06:56

0

我目前解决这个问题的方法是暂时将数据保存在Session中。

 linije = search.PretraziLinije(); 
     Session["direktneLinije"] = linije.DirektneLinije; 
     Session["jednoPresjedanjeLinije"] = linije.LinijeUzJednoPresjedanje; 
     Session["dvaPresjedanjaLinije"] = linije.DirektneLinije; 

并只传递字段的索引来访问相应的数据。

@for (int index = 0; index < Model.DirektneLinije.Count; index++) 
    { 
     LinijaSM item = Model.DirektneLinije[index]; 
     <tr> 
      <td>@item.Naziv 
      </td> 
      <td> 
       @using (Ajax.BeginForm("RenderStanice", 
        new { index, bpr = 0 }, 
        new AjaxOptions 
        { 
         HttpMethod = "POST", 
         UpdateTargetId = "staniceLinije", 
         InsertionMode = InsertionMode.Replace 
        })) 
       { 

        <input type="submit" value="Stanice" /> 
       } 
      </td> 
     </tr> 
    } 

我不知道,这是一个很好的方法,但因为它是被访问的几次数据相当小的金额,然后变得无关紧要,它会更昂贵的再次计算,或坚持在数据库中。

如果any1可以提供更好的解决方案,请做。

相关问题