2015-12-02 2 views
0

, когда я нажимаю на свое тело и принимаю значение, нажмите кнопку, поэтому, когда вы нажмете на него, сделайте эту ошибку.Ошибка после i httppost - узнать выпадающее меню после того, как я нажал кнопку

Я пробовал много вещей, которые теперь выпадают внутри и внутри моего кода, но все равно дает мне ту же ошибку. Я пытаюсь bebug и вижу, как это происходит.

Элемент ViewData, имеющий ключ «SelectedOpgaveValue», имеет тип «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> 
} 
+0

Это потому, что в методе POST вы возвращаете представление, но не переназначили 'SelectList' - то есть' model.OpgaveValueList = новый SelectList (элементы, «Значение», «Текст»); 'как вы делали в методе GET –

+0

@ StephenMuecke Что вы, в конце концов, с этим? –

+0

Я неправильно понимаю вас на мгновение @StephenMuecke –

ответ

0

происходит ошибка, потому что, когда вы вернетесь вид я n методом 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() 
}; 

Чтобы держать вещи 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() 
    }; 
} 

, а затем и в ГЭТ и методы POST позвоните ему, прежде чем возвращать вид

ConfigureViewmodel(model); 
return View(model); 
+0

Я пытался сделать то, что вы пишете и объясняете, но, к сожалению, он говорит мне по-прежнему ту же ошибку. :( –

+0

Это не так. Вы тоже сделали еще одну ошибку. Вы уверены, что добавили этот код в методе POST? –

+0

Мне нужно будет обновить и посмотреть, что я делаю? –