Timothy Heckler Ответов: 2

Что я делаю не так с dropdownlist save to database, entity framework, могу перейти к решениям 2 и 3 для последней версии delima


Я думаю, что проблема заключается в действии create, размещении некоторого кода, никаких ошибок, просто пустые поля базы данных для категорий, приоритетов и полей Site_Admins в моей таблице билетов, я пытаюсь создать страницу, которая будет сохранена в базе данных, а затем вытащить список элементов базы данных, когда я нажимаю кнопку create на странице create, появляется страница списка, все, кроме тех полей, которые перечислены выше, заполняются в базе данных или на странице просмотра.
КОНТРОЛЛЕР:

public class TicketsController : Controller
    {
        // GET: Tickets
        
        Helpdesk2017Db _db = new Helpdesk2017Db();
     
        // GET: Tickets
        public ActionResult Tickets()
        {
            var model = from a in _db.Tickets orderby a.Date ascending select a;
            
            return View(model);
        }

        // GET: Tickets/Details/5
        public ActionResult Details(int id)
        {
            var view = _db.Tickets.Single(v => v.Id == id);
            return View(view);
        }

        // GET: Tickets/Create
        public ActionResult Create()
        {   
            ViewData["Categories"] = new SelectList(_db.Categories, "Id", "CategoryName");     
            ViewData["Priorities"] = new SelectList(_db.Priorities, "Id", "PriorityName");     
            ViewData["Site_Admins"] = new SelectList(_db.Site_Admins, "Id", "Name");
            return View("Create");
        }

        // POST: Tickets/Create
        [HttpPost]
        public ActionResult Create(Tickets Tickets)
        {
            if (ModelState.IsValid)
            {
                _db.Tickets.Add(Tickets);
                _db.SaveChanges();
                // TODO: Add insert logic here
                return RedirectToAction("Tickets");
            }
            return View("Tickets");
        }

МОДЕЛЬ:
public class Tickets
    {
        public IEnumerable<selectlistitem> Priorities { get; set; }
        public IEnumerable<selectlistitem> Categories { get; set; }
        public IEnumerable<selectlistitem> Site_Admins { get; set; }
        public int Id { get; set; }
        public DateTime Date { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public long Telephone { get; set; }
        public string Location { get; set; }
        public string Region { get; set; }
        public string ComputerName { get; set; }
        public long AssetTag { get; set; }
        public string Subject { get; set; }
        public string Body { get; set; }
      //public  File
      //public  File  
      //public File     
    }
}

СОЗДАТЬ ПРЕДСТАВЛЕНИЕ:
@Html.DropDownList("Id", ViewData["Site_Admins"] as SelectList, "Assign To", new { @class = "form-control", @id = "Id" })
            @Html.DropDownList("Id", ViewData["Priorities"] as SelectList, "Select Priority", new { @class = "form-control", @id = "Id" })
            @Html.DropDownList("Id", ViewData["Categories"] as SelectList, "Select Category", new { @class = "form-control", @id = "Id" })


Представление списка это просто базовый список извлеченный из базы данных,
Я знаю, что все работало до того, как я добавил информацию о выпадающем списке. Выпадающие списки работают корректно, проблема заключается в сохранении выбранного элемента со страницы создания, добавлении в базу данных вместе с другим текстом на странице и вытягивании в список просмотра в виде перечисленного " билета"

Что я уже пробовал:

Я перепробовал все версии dropdownlist и dropdownlistfor кода в интернете, которые смог найти, для контроллера, класса и представления

Я почти уверен, что проблема заключается в коде контроллера, который я перечислил первым.

Я использую базу данных SQL 2016 express.

Timothy Heckler

Спасибо тебе, Брайан Тан, за то, что починил мой пост.

Graeme_Grant

Это вид и контроллер. Ваша трудность связана с БД, и этот код отсутствует + любые возникшие ошибки.

Разработчики жертвуют и жертвуют своим собственным временем бесплатно, чтобы помочь коллегам-разработчикам разрешить трудности. Важно, чтобы Вы были кристально ясны в том, что вы испытываете, с большим количеством информации, чтобы ваше и их время не было потрачено впустую. Чем яснее вопрос, тем больше шансов, что вы получите благоприятный ответ своевременно.

Пожалуйста, найдите время, чтобы просмотреть эти ссылки, прежде чем отправлять вопросы:
* Базовая отладка с помощью Visual Studio 2010-YouTube[^]
* Некоторые рекомендации по размещению вопросов на форумах[^]
* Сказки из Империи Зла-задавать вопросы-это навык[^]

Как только вы будете готовы обновить вопрос с четкими и краткими деталями, образцом кода, любыми сообщениями об ошибках (включая внутренние детали исключения) и т. д., Пожалуйста, нажмите на кнопку Улучшить вопрос чтобы добавить больше информации к этому вопросу.

Graeme_Grant

Это создание таблицы, где находится добавление к таблице, которая имеет ошибку и сообщение об ошибке??

Опять же, пожалуйста, нажмите на кнопку улучшить вопрос, чтобы добавить больше информации к этому вопросу.

Graeme_Grant

Общий SQL-код используется для создания таблицы, а не для сохранения данных в таблице. Ваш последний вопрос касается загрузки / чтения данных из таблицы и отображения их в списке. 3 совершенно разные вещи. Знаете ли вы, что вы хотите сделать, поскольку заданные вопросы не относятся к делу?

Вот некоторые статьи для начала работы:
* язык SQL: Приступайте к изучению SQL[^]
* MVC + DB: ASP.NET MVC работа с данными | The ASP.NET сайт[^]

Graeme_Grant

Я не знаю никакого другого способа выразить это, но до сих пор вам не удалось создать ни одного кода, который имел бы отношение к вашему вопросу выше. Я и так потратил на это слишком много времени. Может быть, ответит кто-нибудь другой.

Graeme_Grant

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

Timothy Heckler

Я понимаю, что нет необходимости использовать команды sql, потому что я использую entity framework. Выпадающие списки все еще не сохраняются в базе данных, но все остальное есть, проблема в контроллере, я не знаю, как сделать так, чтобы выбранный элемент в выпадающем списке сохранялся в базе данных билетов, вся остальная информация о билете сохраняется, элементы выпадающего списка поступают из других таблиц, но из той же базы данных. есть ли в этом смысл? Мне пришлось разрешить нули в базе данных, чтобы сохранить все остальное, но поля" категории"," приоритеты "и" Site_Admins " в базе данных по-прежнему пусты, эти поля берутся из выпадающих списков.

ZurdoDev

"Я почти уверен, что проблема заключается в коде контроллера, который я перечислил первым". - затем отладьте код и посмотрите, что происходит.

2 Ответов

Рейтинг:
12

Richard Deeming

Начните с исправления вашей модели в соответствии с вашей базой данных:

public class Tickets
{
    public string Priorities { get; set; }
    public string Categories { get; set; }
    public string Site_Admins { get; set; }
    ...

NB: Нет никакой необходимости в том, чтобы столбцы базы данных были nvarchar(max) - вы будете хранить только одно значение в каждом поле. Если вам нужно несколько значений в каждом поле, то ваша структура базы данных неверна, и вы не можете использовать раскрывающийся список. :)

Вам нужно будет заново заполнить списки в ViewData если опубликованная модель недействительна, то, вероятно, стоит перенести ее в другой метод:
private void PopulateLists(Tickets model)
{
    // NB: Using the "model" parameter to preserve the selected value when the user submits the form:
    ViewData["Categories"] = new SelectList(_db.Categories, "Id", "CategoryName", model.Categories);     
    ViewData["Priorities"] = new SelectList(_db.Priorities, "Id", "PriorityName", model.Priorities);
    ViewData["Site_Admins"] = new SelectList(_db.Site_Admins, "Id", "Name", model.Site_Admins);
}

public ActionResult Create()
{
    var model = new Tickets();
    PopulateLists(model);
    return View(model);
}

public ActionResult Create(Tickets model)
{
    if (!ModelState.IsValid)
    {
        PopulateLists(model);
        return View(model);
    }
    
    _db.Tickets.Add(model);
    _db.SaveChanges();
    return RedirectToAction("Tickets");
}

NB: Я только что заметил SaveChangesAsync вызов. Вам либо нужно использовать синхронный SaveChanges метод, или сделайте свое действие async и await результат:
public async Task<ActionResult> Create(Tickets model)
{
    if (!ModelState.IsValid)
    {
        PopulateLists(model);
        return View(model);
    }
    
    _db.Tickets.Add(model);
    await _db.SaveChangesAsync();
    return RedirectToAction("Tickets");
}


На ваш взгляд, убедитесь, что у вас есть правильный класс, указанный в @model директива, а затем использовать DropDownListFor помощник:
@Html.DropDownListFor(m => m.Site_Admins, (SelectList)ViewState["Site_Admins"], "Assign To", new { @class = "form-control" })
@Html.DropDownListFor(m => m.Priorities, (SelectList)ViewData["Priorities"], "Select Priority", new { @class = "form-control" })
@Html.DropDownListFor(m => m.Categories, (SelectList)ViewData["Categories"], "Select Category", new { @class = "form-control" })

Это создаст три <select> элементы с правильным именем и идентификатором, которые позволят связывателю модели сопоставить разнесенное значение со свойством модели.


Timothy Heckler

Дело в том, что "исправление модели в соответствии с базой данных" каждый из этих выпадающих списков имеет свою собственную модель, а также представления и контроллеры, причина в том, что мне нужны эти выпадающие списки, чтобы иметь возможность создавать, редактировать или удалять свои собственные таблицы. Вот почему я все так устроил. Все работает так, как я его настроил, просто пытаюсь выяснить код, чтобы выбранный элемент заполнялся в базе данных билетов, все в форме, кроме информации о выпадающем списке, сохраняется просто отлично. что касается" savechangesAsync ();", то я забыл обновить, что, когда я повторно отправил этот вопрос, я уже внес это изменение, извиняюсь.

Richard Deeming

Да, сущности, на которые вы ссылаетесь, будут иметь свои собственные модели/представления/контроллеры.

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

Это отправляет одно значение на сервер-например: Site_Admins=42 - и у связующего модели нет никакого способа сопоставить это с коллекцией Site_Admins сущности.

И даже если бы это было так, Entity Framework не смогла бы сопоставить коллекцию Site_Admins сущности возвращаются к идентификатору одной сущности, которую вы хотите связать с новой сущностью. Tickets сущность.

Timothy Heckler

Хорошо, смотрите решение 3, теперь единственная проблема, которая у меня есть, это то, что база данных записывает только идентификатор выпадающих списков, а не имя, должен ли я создавать поля в таблице для CategoryName, PriorityName и Name(для Site_Admins) ?

Richard Deeming

Это то, что он должен делать. Вы сохраняете первичный ключ записи поиска в билете и присоединяетесь к таблице поиска, Если вам нужно получить имя.

Это базовая нормализация базы данных.

Timothy Heckler

Я понимаю, что, однако, то, что я хотел сделать, было помещено имя выбранного элемента как в базу данных, так и в выпадающий список, так что в итоге я просто дважды назвал выбранное имя элемента и опустил идентификатор все вместе, это может быть неправильно, это может быть грязно, но это работает для моих целей, спасибо за вашу помощь.

Timothy Heckler

Хорошо, я попробую это сделать, это может занять у меня немного времени, а затем я отправлю ответ и/или приму решение.

Рейтинг:
11

Timothy Heckler

Я смог взять смесь моего исходного кода и предложенного Ричардом Димингом кода, чтобы сделать эту работу, однако выпадающие списки показывают правильный путь, но в базе данных он сохраняет только идентификатор, я не хочу, чтобы он сохранял идентификатор, я хочу, чтобы он сохранял "имя", выбранное из выпадающего списка, в базу данных. Есть идеи, что добавить или изменить?

Изменения в коде, я принял его предложение о том, чтобы вытащить код [viewdata] и поместить его в публичную пустоту,

затем оставил мой код создания в покое, за исключением добавления PopulateList (model), как он предложил.