c# - ASP.Net MVC 总是将 0 路由到方法
问题描述
这是我的看法(全图)
@model List<BlogPostLayoutModel>
@{
ViewData["Title"] = "Index";
}
@foreach (var item in Model)
{
<div class="row">
<div class="col-md-12">
<h2 class="text-center">
@item.Title
</h2>
<div class="col-md-9 thumbnail">
<img src="/home/getimage/@item.IDPost" />
</div>
<p>@item.Content</p>
</div>
</div>
}
这是 Home 控制器的 GetImage 方法
public async Task<ActionResult> GetImage(int id)
{
var post = await _blogContext.Posts.FirstOrDefaultAsync(m => m.IDPost == id);
return File(post.Image, post.Image_Extension);
}
当我调试时,我可以看到模型中的每个对象的 id 约为 1000(数据库中的某个实数),但是当我调试 GetImage 方法时,它总是通过 0。
路由定义:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{pageNumber=1}");
});
控制器方法:
public async Task<IActionResult> Index(int pageNumber)
{
blogPages = BlogPages();
ViewBag.pageNumber = pageNumber;
ViewBag.blogPages = blogPages;
List<BlogPostLayoutModel> bPLMList = PostsForBlogPage(pageNumber);
return View(bPLMList);
}
和 BlogPostLayourModel 定义(没有不必要的方法):
public class BlogPostLayoutModel
{
public int IDPost { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public string AuthorUserName { get; set; }
public DateTime DateCreated { get; set; }
public byte[] ImageFromPost { get; set; }
public string Image_Extension { get; set; }
}
解决方案
实际上,pageNumber
作为默认参数,在正常情况下,并不是一个明智的选择。
您应该将路由更改为:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
这将破坏使用 pageNumber 作为默认路由的代码,但您会发现这将起作用:
<img src="/home/getimage/@item.IDPost" />
对于其他链接,使用 pageNumber,您将需要以下语法:
<img src="/home/getimage?pageNumber=@item.PageNumber" />
这一切的动机是由于以下事实:
- 很多时候,你需要一个(详细的)记录并且经常被 id 查询
- pageNumber 经常带有 pageSize,所以基本上经常是一个更复杂的对象。
此外,如果要pageNumber
为单个操作设置默认参数,可以使用 route 属性对其进行标记:
[Route("{pageNumber}")]
public async Task<IActionResult> Index(int pageNumber)