当我点击我的身体并取一个值时,点击按钮,所以当点击它时,所以犯这个错误。
我已经尝试了很多东西,现在在我的代码后面下拉和内部,但它仍然给我同样的错误。我尝试一下bebug,看看它是如何发生的。
具有键"SelectedOpgaveValue"的 ViewData 项的类型为"System.String",但必须为"IEnumerable"类型。
Line 48:
Line 49: <div class="form-group">
Line 50: @Html.DropDownListFor(x => x.SelectedOpgaveValue, Model.OpgaveValueList, new
Line 51: {
Line 52: @class = "form-control"
我的控制器:
[MvcApplication.SessionExpire]
[HttpGet]
public ActionResult Index()
{
DataLinqDB db = new DataLinqDB();
OpgaverPage model = new OpgaverPage();
var random = new Random();
var antalopgaver = db.Questions.Count();
var number = random.Next(antalopgaver);
//henter en random spørgsmål.
var A = db.Questions.Where(i => i.fk_Categories == 1).Skip(number).Take(1).FirstOrDefault();
model.Overskift = A.title;
model.HiddenId = A.id;
//Henter alle de svar muligheder man har til den id som man få fra A
List<Question_Answer> QA = db.Question_Answers.Where(i => i.fk_Question == A.id).ToList();
//dropdown her
List<SelectListItem> items = new List<SelectListItem>();
foreach (var item in QA.ToList())
{
items.Add(new SelectListItem() { Text = item.text, Value = item.id.ToString() });
}
//seleced dropdown
model.OpgaveValueList = new SelectList(items, "Value", "Text");
return View(model);
}
[MvcApplication.SessionExpire]
[HttpPost]
public ActionResult index(OpgaverPage opgavervalue)
{
DataLinqDB db = new DataLinqDB();
if (ModelState.IsValid)
{
var opgaver = db.Question_Answers.FirstOrDefault(i => i.fk_Question == opgavervalue.HiddenId);
if (opgaver != null)
{
if (opgavervalue.SelectedOpgaveValue.ToString() == opgaver.id.ToString() && opgaver.er_svaret == true)
{
PointHelper.Point.PointInsert("opgaver");
}
else
{
//error
ModelState.AddModelError("", "Desværre dit svar forkert");
}
}
else
{
return RedirectToAction("index");
}
}
return View(opgavervalue);
}
型:
public class OpgaverPage
{
public string Overskift { get; set; }
public int HiddenId { get; set; }
[Display(Name ="Spørgsmål")]
public string Svar { get; set; }
public List<Question_Answer> QuestionList { get; set; }
public IEnumerable<SelectListItem> OpgaveValueList { get; set; }
public string SelectedOpgaveValue { get; set; }
}
index.cshtml
<p>@Model.Overskift</p>
@using (Html.BeginForm("index", "Opgaver"))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(i => i.HiddenId)
<div class="form-group">
// Error is here!!
@Html.DropDownListFor(x => x.SelectedOpgaveValue, Model.OpgaveValueList, new { @class = "form-control" })
</div>
<button type="submit" class="btn btn-effect-ripple btn-success"><i class="fa fa-check"></i> Tjek mit svar</button>
}
此错误的原因是,当您在 POST 方法中返回视图时,OpgaveValueList
的值null
(并且 DropDownListFor()
方法回退到期望第一个参数IEnumerable
的重载。在返回视图之前,需要重新分配 OpgaveValueList
的值,就像在 GET 方法中所做的那样。
另请注意,从第一个IEnumerable<SelectListItem>
(这就是SelectList
(进行额外的开销是没有意义的。您的代码可以简单地
List<SelectListItem> items = new List<SelectListItem>();
foreach (var item in QA.ToList())
{
items.Add(new SelectListItem() { Text = item.text, Value = item.id.ToString() });
}
model.OpgaveValueList = items;
return View(model);
甚至更简单
model.OpgaveValueList = QA.Select(x => new SelectListItem
{
Text = x.text,
Value = x.id.ToString()
};
为了保持干燥,我建议你创建一个私有方法
private void ConfigureViewmodel(OpgaverPage model)
{
model.OpgaveValueList = db.Question_Answers.Where(i => i.fk_Question == A.id.Select(x => new SelectListItem
{
Text = x.text,
Value = x.id.ToString()
};
}
然后在 GET 和 POST 方法中调用它,然后返回视图
ConfigureViewmodel(model);
return View(model);