首页 > 解决方案 > 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; }
 }

标签: c#asp.net-core-mvc

解决方案


实际上,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)

可以在此处此处找到有关路由的更多信息(假设您使用的是 asp.net Core。


推荐阅读