C# ASP.NET内核将ID传递给控制器以显示页面
我正在尝试使用C# ASP.NET内核将ID传递给控制器以显示页面,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我正在尝试使用DbContext在页面中显示数据 这是我的控制器: public async Task<IActionResult> Index(int? page) { int _page; if (page.HasValue) { _page = page.Value; } else _page = 1; return Vie
DbContext
在页面中显示数据
这是我的控制器:
public async Task<IActionResult> Index(int? page)
{
int _page;
if (page.HasValue)
{
_page = page.Value;
}
else
_page = 1;
return View(await _context.Agent.Skip(_page-1).Take(10).ToListAsync());
公共异步任务索引(int?页)
{
国际网页;
如果(第页,HasValue)
{
_page=page.Value;
}
其他的
_page=1;
返回视图(wait_context.Agent.Skip(_page-1).Take(10.ToListAsync());
以及包含链接的“我的布局”页面:
<li><a asp-area="" asp-controller="Agents" asp-action="Index" asp-route-id="1" >סוכן</a></li>
סוו
两件事:
A) 它似乎不起作用,无论我在asp路由id中传递什么,都会显示相同的列表。我做错了什么
B) 工作完成后,我如何呈现页面供用户选择?(例如1,2,3..90)
谢谢。您的参数名为page
,但您提供了一个id
路由值。将page
参数的操作方法重命名为id
,它应该可以工作。Michal回答了您的第一个问题。关于第二个问题,您可以使用第三方标记帮助程序,如
或者为视图编写自己的分页逻辑实现,如下所示(主要基于),这不是一个完美的分页实现,但仍然有效:
页面的模型:
public class PageViewModel
{
public int PageNumber { get; }
public int TotalPages { get; }
public PageViewModel(int count, int pageNumber, int pageSize)
{
PageNumber = pageNumber;
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
}
public bool HasPreviousPage => (PageNumber > 1);
public bool HasNextPage => (PageNumber < TotalPages);
}
并在视图中使用它,如(别忘了在_ViewImports.cshtml中导入标记助手):
控制器的名称和代码:
public async Task<IActionResult> Index(int page=1)
{
int pageSize = 10;
var count = await _context.Agent.CountAsync();
var items = await _context.Agent.Skip((page - 1) * pageSize).Take(pageSize).ToListAsync();
PageViewModel pageVm= new PageViewModel(count, page, pageSize);
IndexViewModel vm= new IndexViewModel
{
PageViewModel = pageVm,
Agents =items // need to create table in view from Agent properties
};
return View(vm);
}
更新2:
为了使用这种方法,请不要忘记将索引页的模型更改为IndexViewModel
,并在_ViewImports.cshtml中注册标记帮助程序
@* Using and tag helper imported in _ViewImports.cshtml *@
@model IndexViewModel
@{
ViewData["Title"] = "Home";
}
<div>
<table class="table">
<tr><th>Name</th><th>Age</th></tr>
@foreach (var a in Model.Agents)
{
<tr><td>@a.Name</td><td>@a.Age</td></tr>
}
</table>
</div>
<pager page-model="@Model.PageViewModel" page-action="Index" page-controller="Home"></pager>
@*使用并标记在_ViewImports.cshtml中导入的帮助程序*@
@模型索引模型
@{
ViewData[“标题”]=“主页”;
}
姓名
@foreach(Model.Agents中的var a)
{
@a。Name@a.Age
}
更新3:
如果您像我上面写的那样使用IndexViewModel
,但不像我的示例中那样使用foreach,那么您应该将@Html.DisplayNameFor(model=>model.Name)
更改为@Html.DisplayNameFor(model=>model.Agents.Name)
@addTagHelper*,Microsoft.AspNetCore.Mvc.TagHelpers
只导入内置的ASP.NET核心标记帮助程序。要导入自定义标记,您应该使用@addTagHelper*,YourAssemblyName
,其中YourAssemblyName
是您的项目名称('AgentApp`例如),请参阅以获取更多信息
看起来您正在使用asp.net核心
.tagaccordingly@Rahul是的,修复了。谢谢,它成功了。在另一个主题上,我如何在底部添加动态页面选择(根据存在的数据量生成?)非常感谢。这似乎正是我所需要的。@sagi没有问题。很高兴提供帮助。嘿,我不知道在视图中具体在何处实现该用法,我试图将其放在索引页面中,但我收到一个错误IENumerable不包含PageViewModel的定义@sagi请检查我的回答。我想你忘了将视图的@model
从IENumerable
更改为IndexViewModel
public class IndexViewModel
{
public IEnumerable<Agent> Agents { get; set; }
public PageViewModel PageViewModel { get; set; }
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
IUrlHelper urlHelper = urlHelperFactory.GetUrlHelper(ViewContext);
output.TagName = "div";
// we put our links in list
TagBuilder tag = new TagBuilder("ul");
tag.AddCssClass("pagination");
for (int i = 1; i <= PageModel.TotalPages; i++)
{
TagBuilder linkItem = CreateTag(i, urlHelper);
tag.InnerHtml.AppendHtml(linkItem);
}
output.Content.AppendHtml(tag);
}
@* Using and tag helper imported in _ViewImports.cshtml *@
@model IndexViewModel
@{
ViewData["Title"] = "Home";
}
<div>
<table class="table">
<tr><th>Name</th><th>Age</th></tr>
@foreach (var a in Model.Agents)
{
<tr><td>@a.Name</td><td>@a.Age</td></tr>
}
</table>
</div>
<pager page-model="@Model.PageViewModel" page-action="Index" page-controller="Home"></pager>