通过整个模型。"列表"到同一控制器中的另一个动作(从视图)

时间:2016-05-04 20:09:14

标签: c# asp.net-mvc

我真的不知道如何做到这一点......

我试图通过我的整个模型。" List"我的控制器中的另一个动作。

(我试图传递的列表是IEnumerable< Client> Results)

视图模型:

public class IndexViewModel
{
    [DisplayName("Pesquisa")]
    [MinLength(3, ErrorMessageResourceName = "MinLengthErrorMessage", ErrorMessageResourceType = typeof(Messages))]
    public string Query { get; set; }

    [DisplayName("Página")]
    public int? Page { get; set; }

    [DisplayName("Tamanho da Página")]
    public int? PageSize { get; set; }

    [DisplayName("Total de Páginas")]
    public int TotalPages { get; set; }

    [DisplayName("Resultados")]
    public IEnumerable<Client> Results { get; set; }

    public PagerViewModel ToPagerViewModel()
    {
        return new PagerViewModel()
        {
            Page = this.Page.GetValueOrDefault(1),
            PageSize = this.PageSize.GetValueOrDefault(20),
            TotalPages = this.TotalPages
        };
    }
}

视图

@model EFGEREN.App.Models.ViewModels.Clients.IndexViewModel
@using System.Linq
@using System.Web.Mvc
@using Microsoft.AspNet.Identity
@using EFGEREN.App.Models.Contexts
@using EFGEREN.App.Models.Entities
@using EFGEREN.App.Models.Entities
@using Resources

@Html.ActionLink("Export lista de emails CSV", "ExportClientsListToCSV", Model.Results)

<table class="table table-striped">
    <tr>
        <th>@("Código")</th>
        <th>@("Informações Gerais")</th>
        <th>@("Endereço")</th>
        <th>@("Contato")</th>
        <th>@("Cliente desde")</th>
        <th>@("Última atividade")</th>
        <th></th>
    </tr>

    @foreach (var item in Model.Results.OrderBy(x => x.DisplayName))
    {
        <tr>
            //showing my data here... As its a lot of things I just omited it
        </tr>
    }
</table>

以下是我填充viewmodel的方法:

        public ActionResult Index([Bind(Include = "Query,Page,PageSize")] IndexViewModel input)
    {
        var trimmedQuery = (input.Query ?? string.Empty)
            .TrimStart(new[] { ' ', '0', '.', ',' })
            .Trim();

        var query = db.Clients as IQueryable<Client>;

        if (!string.IsNullOrWhiteSpace(trimmedQuery))
            query = query.Where(client => (
                (client.IsDeleted == false) && (
                    (client.Id.ToString().Contains(trimmedQuery)) ||
                    (!string.IsNullOrEmpty(client.OfficialName) && client.OfficialName.ToLower().Contains(trimmedQuery)) ||
                    (!string.IsNullOrEmpty(client.DisplayName) && client.DisplayName.ToLower().Contains(trimmedQuery)) 
                )
            ));

        var currentUserName = User.Identity.GetUserName();
        if (!User.IsInRole("Master") && !User.IsInRole("Manager"))
            query = query.Where(results => (results.AssignedToLogin == currentUserName)&&
                                           (results.IsDeleted==false));

        var paging = input.ToPagerViewModel();
        var pageIndex = (paging.Page - 1);
        input.TotalPages = query.Count() / paging.PageSize;
        input.Results = query
            .OrderBy(d => d.DisplayName)
            .Skip(paging.PageSize * pageIndex)
            .Take(paging.PageSize)
            .ToArray();

        return View(input);
    }

将会收到它的行动结果:

 public void ExportClientsListToCSV(IEnumerable<Client> Results)
    {
    //do something
    }

正如您所看到的,我尝试在我的视图中使用和ActionLink传递数据,但我的操作总是得到null&#34;结果&#34; ...

我是C#的新手,所以我可能会遗漏一些对你来说很明显的东西...

我感谢任何帮助,并提前感谢。

2 个答案:

答案 0 :(得分:1)

我会避免传递整个客户端列表,只是传递有限的信息以从数据库中重新获取集合。如果必须传递信息而不重新获取信息(性能原因)。您需要自己构建URL并最终得到类似的东西。 ../ExportClientsListToCSV?clientids[0]=42&clientids[1]=624&clientids[2]=5‌​662&clientids[3]=666

但请注意,URL的最大长度有一个长度,这只包括当前页面上的客户端。如果这是预期的行为,我只会传入相同的过滤器(查询,页面大小和页码)。

@Html.ActionLink("Export lista de emails CSV", "ExportClientsListToCSV", new {Model.Results.query, Model.Results.Page, Model.Results.PageSize})

但是,您更有可能将与查询匹配的所有客户端导出到CSV文件,那么为什么不传递查询字符串呢?

@Html.ActionLink("Export lista de emails CSV", "ExportClientsListToCSV", new {Model.Results.query})

无关注: 在与您的问题无关的注释中,您可以通过在Views文件夹中包含web.config内的命名空间来清理视图中的多个using语句。

例如......

<?xml version="1.0"?>
<configuration>
  <!-- config sections -->
  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, [version info]" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />

        <add namespace="System.Linq" />
        <add namespace="System.Web.Mvc" />
        <add namespace="Microsoft.AspNet.Identity" />
        <add namespace="EFGEREN.App.Models.ViewModels" />
        <add namespace="EFGEREN.App.Models.Contexts" />
        <add namespace="EFGEREN.App.Models.Entities" />
        <add namespace="EFGEREN.App.Models.Entities" />
        <add namespace="Resources" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>
<!-- Other sections here -->
</configuration>

答案 1 :(得分:0)

我认为你误解了一些概念。它与C#关系不大,更多的是关于如何在Web /无状态环境中传递数据。

最简单的方法是对原始方法进行一些修改:

  1. 在“索引”操作中包含“导出”参数,并将其默认为“false”。

  2. 修改您的操作逻辑,根据参数返回不同的ActionResults。如果为false,则返回View(),否则返回最终导出项目的操作结果

  3. 在实际视图中,更改操作链接,以便使用export = true标志重新创建相同的网址。

  4. 一旦完成,请考虑重构主要操作以获得更好的可维护性。