У меня возникла проблема с попыткой загрузить частичное представление на странице индекса, ошибка, отображаемая сайтом, следующая:
Нет элемента 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" }))
Что не так с моим кодом?
Этот код был в основном сгенерирован автоматически из Visual Studio.
Но это в корне неправильно, не так ли? ;)
Конечно, что мне делать? Итак, как должен выглядеть мой код?





Исключение возникло, потому что 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" })
Тот же результат. :(
Проблема заключается в том, что данные просмотра, которые вы передаете из метода контроллера, недоступны в частичном представлении.
Вы пытаетесь взять QuestionType из модели, но он находится в области просмотра (это плохая практика, от которой следует немедленно отказаться в пользу правильной привязки модели через ViewModels).