我 httppost 后出错 - 单击按钮后知道下拉菜单



当我点击我的身体并取一个值时,点击按钮,所以当点击它时,所以犯这个错误。

我已经尝试了很多东西,现在在我的代码后面下拉和内部,但它仍然给我同样的错误。我尝试一下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);

最新更新