Словарь в контроллере сбрасывается на ровном месте в NPE - PullRequest
0 голосов
/ 03 июня 2018

По какой-то причине мой словарь сбрасывается на 0 (без элементов), каждый раз, когда я пытаюсь получить к нему доступ с помощью моего ActionResult Details() метода.Я не совсем уверен, почему это происходит и что я могу сделать, чтобы предотвратить это.Я пытался изменить модификаторы доступа, но это не привело к успеху, я также искал несколько форумов, но трудно найти аналогичную проблему.Я уверен, что это просто, что я просто наблюдаю, если кто-нибудь сможет помочь, я был бы очень признателен.Я отладил его, чтобы увидеть, действительно ли данные добавляются в словарь.Похоже, что это добавляется просто отлично.

using TransactionImporter.Factory;
using TransactionImporter.WebUI.Models;
using TransactionImpoter.Domain;

namespace TransactionImporter.WebUI.Controllers
{
    public class DownloadController : Controller
    {
        private IUploadDetailLogic uploadDetailLogic = UploadDetailFactory.CreateLogic();
        private IExporterLogic exporterLogic = ExporterFactory.CreateLogic();
        private IUserLogic userLogic = UserFactory.CreateLogic();
        public IDictionary<int, DownloadModels> IdModelDictionary = new Dictionary<int, DownloadModels>();

        // GET: Download
        public ActionResult Index()
        {
            List<UploadDetail> uploadDetailList = uploadDetailLogic.UploadDetailList();
            List<DownloadModels> downloadableList = new List<DownloadModels>();
            foreach (UploadDetail upload in uploadDetailList)
            {
                User user = userLogic.GetUserById(upload.UserId);
                DownloadModels model = new DownloadModels(upload.UploadId, upload.UserId, user.Username,
                    upload.StartTimeUpload.ToString(), upload.FileName, Convert.ToInt32(upload.FileSize));

                downloadableList.Add(model);
                IdModelDictionary.Add(upload.UploadId, model);
            }
            return View(downloadableList);
           }

        // GET: Download/Details/5
        public ActionResult Details(int id)
        {
            return View(IdModelDictionary[id]);
        }

DownloadModels:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TransactionImporter.WebUI.Models
{
    public class DownloadModels
    {
        public DownloadModels(int uploadId, int userId, string uploadedOn, string fileName, int fileSize)
        {
            UploadId = uploadId;
            UserId = userId;
            UploadedOn = uploadedOn;
            FileName = fileName;
            FileSize = fileSize;
        }
        public DownloadModels(int uploadId, int userId, string username, string uploadedOn, string fileName, int fileSize)
        {
            UploadId = uploadId;
            UserId = userId;
            Username = username;
            UploadedOn = uploadedOn;
            FileName = fileName;
            FileSize = fileSize;
        }
        public DownloadModels() { }

        public int UploadId { get; private set; }
        public string UploadedOn { get; private set; }
        public string FileName { get; private set; }
        public int FileSize { get; private set; }
        public int UserId { get; private set; }
        public string Username { get; private set; }
        public IEnumerator GetEnumerator()
        {
            throw new NotImplementedException();
        }
    }
}

Вот индекс, который вызывает метод ActionResult Details() в контроллере каждый раз, когда пользователь наводит курсор мыши на деталиHREF.Поскольку словарь решает сбросить себя до 0, каждый раз, когда я наводю курсор на детали, я получаю NPE, потому что он не может найти ключ, который я ищу, потому что в словаре нет данных.

@model IEnumerable<TransactionImporter.WebUI.Models.DownloadModels>

@{
    ViewBag.Title = "Index";
}

<h2>Uploads</h2>

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Username)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.FileName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.UploadId)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.UploadedOn)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Username)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FileName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.UploadId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.UploadedOn)
            </td>
            <td>
                <a href="#" onmouseover="ShowDetails(@item.UploadId)">Details</a> |
                @Html.ActionLink("Download-EU", "DownloadEu", new { id = item.UploadId, controller = "Download" }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.UploadId, controller = "Download" })
            </td>
        </tr>
    }

</table>
<div class="col-md-6" id="MyDetails">

</div>

@section Scripts
{
    <script>

        var ShowDetails = function (id) {

            var detailsDiv = $('#MyDetails');
            $.get('/Download/Details/', { id: id }, function (data) {
                detailsDiv.html(data);
            });
        };
    </script>
}

1 Ответ

0 голосов
/ 03 июня 2018

Вы добавляете только к своему IdModelDictionary объекту в действии Index().Но тогда вы ничего с этим не делаете.

Позже вы пытаетесь сослаться на него в своем Details() действии, но сначала ничего не добавляете к нему.

Точка, в которой вы находитесьотсутствует то, что эти действия совершенно не связаны и не имеют статуса.Каждый HTTP-запрос к этому контроллеру приводит к созданию нового экземпляра контроллера.Таким образом, экземпляр контроллера, который выполнил Index() (и заполнил его IdModelDictionary объект), и экземпляр контроллера, который выполнил Details(), являются различными экземплярами объекта контроллера.К моменту создания второго экземпляра первый уже давно не существует.

Чтобы сохранить данные в нескольких HTTP-запросах, эти данные должны быть где-то сохранены.База данных - это обычное место для сохранения данных.Другие параметры включают, но не ограничиваются:

  • Страница (поэтому данные доступны на стороне клиента)
  • Состояние сеанса
  • Кэш приложения
  • static properties
  • Файловая система
  • Другие системы кэширования (которые, скорее всего, используют какую-либо базу данных)

Каждая имеет свои плюсы и минусы,Вы можете взвесить варианты и принять решение.Вероятно, самый распространенный и наименее опасный подход - хранить ваши данные в базе данных.В действии Index() обычно отображается сводный список данных, а в действии Details() обычно отображаются подробности конкретной записи из данных.Каждое действие будет запрашивать базу данных отдельно.

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