我真的不知道如何做到这一点......
我试图通过我的整个模型。" 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#的新手,所以我可能会遗漏一些对你来说很明显的东西...
我感谢任何帮助,并提前感谢。
答案 0 :(得分:1)
我会避免传递整个客户端列表,只是传递有限的信息以从数据库中重新获取集合。如果必须传递信息而不重新获取信息(性能原因)。您需要自己构建URL并最终得到类似的东西。 ../ExportClientsListToCSV?clientids[0]=42&clientids[1]=624&clientids[2]=5662&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 /无状态环境中传递数据。
最简单的方法是对原始方法进行一些修改:
在“索引”操作中包含“导出”参数,并将其默认为“false”。
修改您的操作逻辑,根据参数返回不同的ActionResults。如果为false,则返回View(),否则返回最终导出项目的操作结果
在实际视图中,更改操作链接,以便使用export = true标志重新创建相同的网址。
一旦完成,请考虑重构主要操作以获得更好的可维护性。