【问题标题】:Error after i httppost - know dropdown after i have click button我httppost后出错-点击按钮后知道下拉菜单
【发布时间】:2015-12-02 21:35:58
【问题描述】:

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

我已经尝试了很多东西,现在在我的代码后面下拉和里面,但它仍然给我同样的错误。我试试这个小虫,看看它是怎么发生的。

具有“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 方法中您返回了视图但没有像在 GET 方法中那样重新分配 SelectList - 即 model.OpgaveValueList = new SelectList(items, "Value", "Text");
  • @StephenMuecke 你对它有什么看法?
  • 我误会了你一会儿@StephenMuecke

标签: c# asp.net-mvc


【解决方案1】:

发生错误是因为当您在 POST 方法中返回视图时,OpgaveValueList 的值是 null(而 DropDownListFor() 方法回退到期望第一个参数为 IEnumerable 的重载。在返回视图之前,您需要重新分配 OpgaveValueList 的值,就像在 GET 方法中所做的那样。

请注意,从第一个生成第二个IEnumerable&lt;SelectListItem&gt;(这就是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()
};

为了保持 DRY,我建议你创建一个私有方法

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);

【讨论】:

  • 我已经尝试按照您所写和解释的方式进行操作,但不幸的是它仍然告诉我同样的错误。 :(
  • 它没有。你一定也犯了另一个错误。您确定在 POST 方法中添加了该代码吗?
  • 您希望在 POST 中的哪个位置怀孕??
  • 我已经更新了答案。你是什​​么意思想要怀孕
  • 你这样写,你确定你在POST方法中添加了那个代码吗?那我想你想让我把它扔到哪里
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多