ViewData отсутствует в представлении - PullRequest
0 голосов
/ 06 января 2019

На моей веб-странице сведений об оркестре (со следующей структурой URL: orchestra / details / {id}), когда я нажимаю на ссылку Details для музыканта (которая должна привести меня к музыканту / details / {id}), Я получил исключение нулевой ссылки в моем файле просмотра сведений о музыканте. Он добавлен в следующую ссылку в моем коде для создания инструмента, но я не могу сказать, какая переменная ему не нравится:

<a asp-action="create" asp-controller="instrument" asp-route- 
id="@orchestra.Id" asp-route-musicianId="@Model.Id"> Create an 
instrument</a>

Я проверил мой метод Musician Details в MusicianController и думаю, что это может быть проблема с привязкой модели. Я также просмотрел свое представление сведений о музыканте и не понимаю, почему оно выдает ошибку.

- Метод сведений о музыканте в файле MusicianController --------------------

public IActionResult Details([Bind(Prefix = "id")] int musicianId)
{
    var musician = _repo.ReadMusician(musicianId);
    if(musician == null)
    {
        return RedirectToAction("Details", "Orchestra", new { id = 
        musicianId});
    }

    ViewData["Musician"] = musician;
    return View(musician);
}

- Сведения о музыканте Просмотреть файл ---------------------------------

@using OrchestraManagement.DbFirstData
@model Musician

@{
    var orchestra = (Orchestra)ViewData["Orchestra"];
    //var musician = (Musician) ViewData["Musician"];
    ViewData["Title"] = "Details";
}

<h2>Details</h2>
<div>
    <input asp-for="Id" type="hidden" value="@Model.Id"/>
    @*<input name="orchestraId" value="@orchestra.Id" type="hidden"/>*@
    @*<input name="musicianId" value="@musician.Id" type="hidden"/>*@
    <h4>Musician</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Id)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Id)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.FirstName)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.FirstName)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.LastName)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.LastName)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.Section)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Section)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.SectionLeader)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.SectionLeader)
        </dd>
        <dt>
            Number of instruments:
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Instrument.Count)
        </dd>
    </dl>
    <hr/>
    <h1> Instruments For This Musician:</h1>
    <table class="table">
        <thead>
            <tr>
                <th>
                Serial Number
                </th>
                <th>
                Description
                </th>
                <th>
                Maintenance Date
                </th>
                <th>
                Condition
                </th>
                <th>
                Links:
                </th>
            </tr>
        </thead>
   </table>
   <tbody>
       @foreach(var item in Model.Instrument)
       {
        <tr>
            <td> @Html.DisplayFor(modelItem => item.SerialNumber) </td>
            <td> @Html.DisplayFor(modelItem => item.Description)</td>
            <td> @Html.DisplayFor(modelItem => item.MaintenanceDate)</td>
            <td> @Html.DisplayFor(modelItem => item.Condition))</td>
            <td>
                <a asp-action="edit" asp-controller="instrument" asp-route-id="@Model.Id" asp-route-instrumentId="@item.Id">Details</a>
                <a asp-action="delete" asp-controller="instrument" asp-route-id="@Model.Id" asp-route-instrumentId="@item.Id">Delete</a>
            </td>
        </tr>
       }
   </tbody>
   </table>
</div>

<div>
    <a asp-action="create" asp-controller="instrument" asp-route-id="@orchestra.Id" asp-route-musicianId="@Model.Id"> Create an instrument</a> |
    @*<a asp-action="Create" asp-controller="Musician" asp-route-id="@Model.Id"> Create a musician</a> |*@
    <a asp-action="edit" asp-controller="musician" asp-route-id="@Model.Id"> Edit this musician</a>|
    <a asp-action="details" asp-controller="orchestra" asp-route-id="@orchestra.Id">Back to Orchestra Details</a>
</div>

- Метод ReadMusician в моем репозитории базы данных First Orchestra -------

public Musician ReadMusician(int musicianId)
{
    return _db.Musician.Include(m => m.Instrument).FirstOrDefault(m => m.Id 
    == musicianId);
}

1 Ответ

0 голосов
/ 06 января 2019

В представлении, где выдается ошибка, осуществляется доступ к @orchestra.Id.

Предполагалось, что он будет установлен от

 var orchestra = (Orchestra)ViewData["Orchestra"];

Но действие контроллера не устанавливает Orchestra в ViewData, поэтому @orchestra наиболее вероятно null.

Это приведет к исключению нулевой ссылки при попытке доступа к свойству Id по нулевой ссылке.

Я предлагаю вам установить нужные данные в действии, прежде чем возвращать представление.

public IActionResult Details([Bind(Prefix = "id")] int musicianId) {
    var musician = _repo.ReadMusician(musicianId);
    if(musician == null) {
        return RedirectToAction("Details", "Orchestra", new { id = 
        musicianId});
    }

    Orchestra orchestra  = //...code to get the Orchestra

    ViewData["Orchestra"] = orchestra;
    return View(musician);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...