ASP.Net MVC всегда направляет 0 к методу - PullRequest
0 голосов
/ 27 ноября 2018

Вот мой вид (полный вид)

@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>
}

А вот и домашние контроллеры, метод 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);
    }

Когда я отлаживаю, я вижу, что каждый объект в модели имеетидентификатор ~ 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; }
 }

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

На самом деле, использование 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.

0 голосов
/ 27 ноября 2018

Итак, ваш маршрут говорит, что третий параметр маршрута называется pageNumber.Теперь рассмотрим ссылку на изображение:

<img src="/home/getimage/@item.IDPost" />

Идентификатор записи будет сопоставлен с pageNumber при перенаправлении этого запроса.Теперь взгляните на объявление действия:

public async Task<ActionResult> GetImage(int id)

Это говорит о том, что действие ожидает, что запрос имеет параметр с именем id.После того, как запрос направлен на это действие, происходит привязка модели, и во время этого процесса параметры маршрута и запроса сопоставляются с входом действия.В этом случае связыватель модели не найдет id, в котором нуждается действие, потому что в запросе нет ничего с этим именем.Единственный параметр там имеет имя pageNumber.Таким образом, он инициализирует id значением по умолчанию, равным 0.

Один из способов исправить это - использовать строку запроса вместо параметра маршрута, и таким образом явно указать идентификатор сообщения, а также идентификатор:

<img src="/home/getimage?id=@item.IDPost" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...