2015-05-28 2 views
0

Мне нравится генерировать список и связываться в viewmodel, но я получал ошибку ниже, я определял неправильный атрибут?Создать список на viewmodel

Модели элемента передается в словарь типа «SurveyTool.Models.AnswerQuestionViewModel», но этот словарь требует модель элемента типа «System.Collections.Generic.IEnumerable`1 [SurveyTool.Models .AnswerQuestionViewModel].

Edit.cshtml:

@model IEnumerable<SurveyTool.Models.AnswerQuestionViewModel> 

@{ 
    ViewBag.Title = "Edit"; 
} 

<h2>Edit</h2> 

<table> 


@foreach (var item in Model) { 
    <tr> 

     <td> 
      @Html.DisplayFor(modelItem => item.Question) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => item.Answer) 
     </td> 
    </tr> 
} 

</table> 

SURV_AnswerController:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using SurveyTool.Models; 

namespace SurveyTool.Controllers 
{ 
    public class SURV_AnswerController : Controller 
    { 
     private SurveyToolDB db = new SurveyToolDB(); 
     // 
     // GET: /SURV_Answer/ 

     public ActionResult Edit(int Survey_ID) 
     { 
      AnswerQuestionViewModel viewmodel = new AnswerQuestionViewModel(); 

      var query = from r in db.SURV_Question_Ext_Model 
         join s in db.SURV_Question_Model 
         on r.Qext_Question_ID equals 
         s.Question_ID 
         where s.Question_Survey_ID == Survey_ID 
         orderby s.Question_Position ascending 
         select r; 

      foreach(var item in query) 
      { 

       viewmodel.Question = item.Qext_Text; 
      } 

      return View(viewmodel); 
     } 

    } 
} 

AnswerQuestionViewModel:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 


namespace SurveyTool.Models 
{ 
    public class AnswerQuestionViewModel 
    { 
     public string Answer { get; set; } 
     public string Question { get; set; } 
    } 
} 
+1

Вы передаете только объект для просмотра того, в каком представлении ожидает коллекция. – Mairaj

+1

Кроме того, вы переписываете значение в viewmodel.Questions во время цикла. Что-то не так в логике кода. Подумайте еще раз - что вы хотите передать в представление. Похоже, вы хотите передать массив. Затем сгенерируйте массив в действии, но не один объект. –

ответ

1

Ваше возвращение только один AnswerQuestionViewModel элемент, а не сборник. В вашем методе public ActionResult Edit(int Survey_ID) измените

AnswerQuestionViewModel viewmodel = new AnswerQuestionViewModel(); 

в

List<AnswerQuestionViewModel> viewmodel = new List<AnswerQuestionViewModel>(); 

, а затем в foreach петле

foreach(var item in query) 
{ 
    viewmodel.Add(new AnswerQuestionViewModel() { Question = item.Qext_Text }); 
} 
return View(viewmodel); 

Edit

Примечание Есть также проблемы с вашей точки зрения. Вы используете цикл foreach, который генерирует повторяющиеся атрибуты name, поэтому коллекция не будет привязана к сообщению. Он также генерирует недопустимый html из-за дубликатов атрибутов id. Для типа AnswerQuestionViewModel вам необходимо использовать петлю for. Используя for петли, она должна быть

@model List<SurveyTool.Models.AnswerQuestionViewModel> 
@using (Html.BeginForm()) 
{ 
    for(int i = 0; i < Model.Count; i++) 
    { 
     @Html.DisplayFor(m => m[i].Question) 
     @Html.EditorFor(m => m[i].Answer) 
    } 
    <input type="submit" /> 
} 

Однако это только вывесит назад Answer свойство модели. У вас нет свойства, идентифицирующего идентификатор вопроса, так что вам, вероятно, понадобится дополнительное свойство для идентификатора, и введите скрытый ввод для него в представлении.

+0

Необходимо ли это изменить, а также модель IEnumerable для модели List ? – Mairaj

+1

Да, но только потому, что у них есть другие проблемы с представлением (он не будет отправлять сообщения из-за дубликатов атрибутов name и его также недопустимого html из-за дубликатов атрибутов id. Я вскоре обновлю свой ответ с дополнительной информацией –

+0

Еще раз спасибо Стивен, после некоторого времени работы, это то, что я хочу на самом деле. Очень ценю ваше быстрое руководство: «) Будет продолжать учиться! –

Смежные вопросы