Модель из PartialView в контроллер возвращает ноль - PullRequest
1 голос
/ 14 марта 2019

У меня есть PartialView, который получает идентификатор модели, а затем, когда вы нажимаете на ссылку, отправляет идентификатор модели в контроллер. Моя проблема заключалась в том, что было два способа отправки данных из View в Controller, но у меня работал только один. В чем причина?

Это прекрасно сработало для меня

<a type="button" class="btn btn-primary" asp-controller="Dictionary" asp-action="Edit" asp-route-wordId="@Model"><i class="fas fa-edit"></i></a>

Этот не работал

<a type="button" class="btn btn-success" href="@Url.Action("Edit/" + Model)"><i class="far fa-list-alt"></i></a>

У меня вопрос, почему последний не сработал и вернул ноль, если я передаю идентификатор модели в URL

Это мой полный PartialView, который получает ID модели и работает

@model int

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">

<td style="width:150px">
    <div class="btn-group" role="group">
        <a type="button" class="btn btn-primary" asp-controller="Dictionary" asp-action="Edit" asp-route-wordId="@Model"><i class="fas fa-edit"></i></a>
    </div>
</td>

И это моя функция контроллера, которая возвращает данные

public async Task<IActionResult> Edit(int? wordId)
{
    if(wordId == null)
    {
        return NotFound();
    }

    var word = await _db.Dictionaries.FindAsync(wordId);
    if(word == null)
    {
        return NotFound();
    }

    return View(word);
}

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Используемая вами перегрузка Url.Action принимает имя действия, и вы передаете ему что-то вроде /Edit/4.Вам необходимо использовать правильную перегрузку метода Url.Action, которая позволяет указывать значения маршрута.

Это будет выглядеть примерно так:

<a type="button" class="btn btn-success" href="@Url.Action("Edit/" + Model)"><i class="far fa-list-alt"></i></a>

до

<a type="button" class="btn btn-success" href="@Url.Action("Edit", new { wordId = Model } )"><i class="far fa-list-alt"></i></a>`

В качестве примечания, ваше действие Edit принимает обнуляемый wordId, которыйне имеет особого смысла для меня.Обычно, если вы редактируете что-то, оно уже было создано и всегда должно иметь id.Единственный случай, который я могу придумать, где это имеет смысл, - это если действие Edit действительно обрабатывает создание данных, а также редактирование данных, в этом случае это было бы совершенно правильно.

0 голосов
/ 14 марта 2019

Чтобы ответить на ваш главный вопрос, причина того, что ваш первый якорь работает, заключается в том, что аргументы верны.Например:

<a asp-controller="Dictionary" asp-action="Edit" asp-route-wordId="1">Your link</a>

эквивалентно:

<a href="/Dictionary/Edit/1"></a>

Это работает!

Второе не будет работать, потому что вы неправильно используете Url.Action, метод, который вы используете, это Url.Action("Action")

Url.Action("Edit/" + Model) or  Url.Action("Edit/1") 

ищет действие с именем: "Edit / 1", который в вашем случае не будет найден.

, поэтому во втором неработающем примере

<a href="@Url.Action("Edit/" + Model)">Your Link</a>

эквивалентен:

<a href="null" />

В вашем случае вы должны использовать это в своем якоре:

Url.Action("Edit", "Dictionary", new { id = @Model })

эквивалентно / Dictionary / Edit / 1

так:

<a href="@Url.Action("Edit", "Dictionary", new { id = Model })">Your link</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...