В частичной странице Asp.NET IEnumerable нет ViewData

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

Нет элемента ViewData типа «IEnumerable» с ключом «QuestionType». в основном проблема в выпадающем html.

Вот мой частичный:

 <div class = "form-group">
        @Html.LabelFor(model => model.QuestionType, "QuestionType", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class = "col-md-10">
            @Html.DropDownList("QuestionType", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.QuestionType, "", new { @class = "text-danger" })
        </div>
    </div>

Мой контроллер вопросов

public ActionResult Create()
    {
        ViewBag.QuestionType = new SelectList(db.QuestionTypes, "Id", "Name");
        return View();
    }

    // POST: MyQuestions/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "Id,Title,Description,QuestionDate,Tags,QuestionType")] MyQuestion myQuestion)
    {
        if (ModelState.IsValid)
        {
            db.MyQuestions.Add(myQuestion);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.QuestionType = new SelectList(db.QuestionTypes, "Id", "Name", myQuestion.QuestionType);
        return View(myQuestion);
    }

А вот как я называю партиал:

<div class = "modal-body">
            @Html.Partial("_CreatePartial", new MyWebAppInMVC.Database.MyQuestion())
        </div>

В верхней части партиала я использую следующую строку:

@using (Html.BeginForm("Create", "MyQuestions", FormMethod.Post, new { id = "AddModal" }))

Что не так с моим кодом?

Вы пытаетесь взять QuestionType из модели, но он находится в области просмотра (это плохая практика, от которой следует немедленно отказаться в пользу правильной привязки модели через ViewModels).

Davide Vitali 19.03.2019 18:58

Этот код был в основном сгенерирован автоматически из Visual Studio.

Lanshore Dev 19.03.2019 19:01

Но это в корне неправильно, не так ли? ;)

Davide Vitali 19.03.2019 19:03

Конечно, что мне делать? Итак, как должен выглядеть мой код?

Lanshore Dev 19.03.2019 19:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
51
2

Ответы 2

Исключение возникло, потому что QuestionType является свойством ViewBag, и вы не возвращаете какую-либо модель в представление, а также содержит потенциальную коллизию имен, потому что QuestionType уже существует как свойство модели представления:

ViewBag.QuestionType = new SelectList(db.QuestionTypes, "Id", "Name");
return View();

И вы не указываете списки параметров при использовании помощника DropDownList:

@Html.DropDownList("QuestionType", null, htmlAttributes: new { @class = "form-control" })

Рекомендуемый способ предоставления списков параметров в раскрывающемся списке — создание строго типизированного свойства модели представления для хранения списков параметров, как показано в примере ниже:

public class MyQuestion
{
    // other properties

    // this property bounds to dropdownlist
    public int QuestionType { get; set; }

    // option list property
    public List<SelectListItem> QuestionTypeList { get; set; }
}

После этого измените как действие контроллера, так и частичное представление, чтобы сохранить выбранное значение:

Контроллер

public ActionResult Create()
{
    var myQuestion = new MyQuestion();

    myQuestion.QuestionTypeList = db.QuestionTypes.Select(x => new SelectListItem 
    {
        Text = x.Name, 
        Value = x.Id 
    }).ToList();
    return View(myQuestion);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(MyQuestion mq)
{
    if (ModelState.IsValid)
    {
        // process data and redirect
    }

    mq.QuestionTypeList = db.QuestionTypes.Select(x => new SelectListItem 
    { 
        Text = x.Name, 
        Value = x.Id, 
        Selected = (x.Id == mq.QuestionType) 
    }).ToList();
    return View(mq);
}

Частичный вид

<div class = "form-group">
    @Html.LabelFor(model => model.QuestionType, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class = "col-md-10">
        @Html.DropDownListFor(model => model.QuestionType, Model.QuestionTypeList, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.QuestionType, "", new { @class = "text-danger" })
    </div>
</div>

Просто напишите свой @Html.DropDownList следующим образом:

@Html.DropDownList("QuestionType", ViewBag.QuestionType as SelectList,"Select Question Type", htmlAttributes: new { @class = "form-control" })

Тот же результат. :(

Lanshore Dev 20.03.2019 16:42

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

TanvirArjel 20.03.2019 16:43

Другие вопросы по теме