2015-06-10 7 views
-1

На данный момент у меня есть рабочий прототип вопросника с несколькими вопросами и каждый вопрос, имеющий несколько вариантов ответа. Все отображает и экономит. Однако теперь я хотел бы сгруппировать вопрос/ответы в «разделы» в моем представлении «Редактировать». Я пробовал несколько разных методов, но ничего не работает правильно. Рабочий код без разделов следующим образом:EditorTemplates Где или Groupby на вопроснике

Редактировать Просмотр Отчет о прогрессе:

<div class="form-group"> 
    @Html.LabelFor(model => model.ReportAnswers, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(model => model.ReportAnswers) 
    </div> 
</div> 

ReportAnswers.cshtml (шаблон редактора)

<h3> 
    Question 
</h3> 

<p> 
    @Html.DisplayFor(x => x.Question.QuestionText) 
</p> 
@Html.HiddenFor(model => model.QuestionID) 
@Html.HiddenFor(model => model.ReportID) 

@foreach (var answer in Model.Question.PossibleAnswers) 
{ 
    var id = string.Format("answer-{0}", answer.AnswerID); 
    <p> 
     @Html.HiddenFor(model => model.ReportAnswerID) 

     @Html.RadioButtonFor(m => m.AnswerID, answer.AnswerID, new { id = id }) 
     <label for="@id">@answer.AnswerText</label> 
    </p> 
} 

EditController:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(ProgressReport progressReport) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(progressReport).State = EntityState.Modified; 
      db.SaveChanges(); 

      foreach (ReportAnswer answer in progressReport.ReportAnswers) 
      { 
         if (answer.QuestionID != null && answer.AnswerID != null) 
         { 
          db.Entry(answer).State = EntityState.Modified; 
          db.SaveChanges(); 
         }     

      } 

      return RedirectToAction("Index"); 
     } 
     ViewBag.ClientID = new SelectList(db.Clients, "ClientID", "ID", progressReport.ClientID); 
     return View(progressReport); 
    } 

структура данных Разделы -> Вопросы -> Ответы Я тогда есть таблица, которая имеет ProgressReport QuestionID и AnswerID

Я попытался GroupBy в поле зрения, но не знаете, как правильно называть Editortemplate. Фактически, я смог использовать его, но результат был не таким, как ожидалось. этот код:

@foreach (var group in Model.ReportAnswers.GroupBy(s => s.Question.SectionID)) 

Спасибо!

данных Структура сниппета: enter image description here

ответ

-1

я смог разработать решение ... правильный или not..Don't знает ... но он работает. Не стесняйтесь критиковать. Я приветствую это.:)

ProgressReportViewModel:

public class ProgressReportViewModel 
{ 
    public int ReportID { get; set; } 
    public DateTime ReportDateSubmitted {get; set;} 
    public List<ReportAnswer>[] ReportAnswerSection { get; set; } 
    public string[] SectionHeadings { get; set; } 
    public string[] SectionDescriptions { get; set; } 
} 

EditController:

public ActionResult Edit(int? id) 
    { 
     var viewModel = new ProgressReportViewModel(); 

     // Get the section in order of defined display order 
     var questionsection = (from s in db.QuestionSections 
           orderby s.SectionDisplayOrder 
           select new{ 
            s.SectionName, 
            s.SectionDesc 
           }); 

     viewModel.SectionHeadings = new string[11]; 
     viewModel.SectionDescriptions = new string[11]; 
     viewModel.ReportAnswerSection = new List<ReportAnswer>[11]; 

     int i = 0; 
     foreach(var section in questionsection) 
     { 
      // Loop through sections and get the name, desc and the questions/answers 
      viewModel.SectionHeadings[i] = section.SectionName.ToString(); 
      viewModel.SectionDescriptions[i] = section.SectionDesc; 
      viewModel.ReportAnswerSection[i] = db.ReportAnswers.Where(q => q.Question.SectionID == i+1 && q.ReportID == id).Include(s => s.Question.QuestionSection).OrderBy(q => q.Question.DisplayOrder).ToList(); 
      i=i+1; 
     } 

     var report = (from r in db.ProgressReports 
         where r.ReportID == id 
         select new 
         { 
          r.ReportID, 
          r.ReportDateSubmitted, 
          r.ClientID 
         }).SingleOrDefault(); 
     viewModel.ReportID = report.ReportID; 
     viewModel.ReportDateSubmitted = report.ReportDateSubmitted ?? DateTime.MinValue; 


     return View(viewModel); 
    } 



    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(ProgressReportViewModel progressReport) 
    { 
     if (ModelState.IsValid) 
     { 
      ProgressReport PR = db.ProgressReports.Where(x => x.ReportID == progressReport.ReportID).SingleOrDefault(); 


      //db.ProgressReports.Attach(progressReport); 

      db.Entry(PR).State = EntityState.Modified; 
      db.SaveChanges(); 

      for (var i = 0; i <= 10; i++) 
      { 
       foreach (ReportAnswer answer in progressReport.ReportAnswerSection[i]) //.ReportAnswers) 
       { 
        SaveAnswers(answer); 
       } 
      } 

      return RedirectToAction("Index", "Home"); 
     } 
     return View(progressReport); 
    } 

ReportAnswers Редактор шаблона

<h3> 
Question 
</h3> 

<p> 
@Html.DisplayFor(x => x.Question.QuestionText) 
</p> 
@Html.HiddenFor(model => model.QuestionID) 
@Html.HiddenFor(model => model.ReportID) 

@foreach (var answer in Model.Question.PossibleAnswers) 
{ 
var id = string.Format("answer-{0}", answer.AnswerID); 
<p> 
    @Html.HiddenFor(model => model.ReportAnswerID) 

    @Html.RadioButtonFor(m => m.AnswerID, answer.AnswerID, new { id = id }) 
    <label for="@id">@answer.AnswerText</label> 
</p> 
} 

Редактировать Вид:

@for(var i = 0; i<=10; i++) 
    { 
     <h4>@Html.DisplayFor(model => model.SectionHeadings[i]) </h4> 
     <p>@Html.DisplayFor(model => model.SectionDescriptions[i]) </p> 
     @Html.EditorFor(model => model.ReportAnswerSection[i]) 
    } 

Я решил сделать эти массивы, потому что есть один раздел, по крайней мере, мне нужно перехватить, чтобы сделать что-то особенное. В противном случае все остальные разделы являются типичными. Это, похоже, работает, но, как указано, я приветствую любые критические замечания, которые могут иметь люди.

Отличный день!

1

Вам будет лучше создавать модели представлений, которые представляют данные, которые вы хотите отобразить в представлении

public class ReportVM 
{ 
    public int ID { get; set; } 
    // other properties or Report for display/editing 
    public List<SectionVM> Sections { get; set; } 
} 
public class SectionVM 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    // other properties or Report for display/editing 
    public List<QuestionVM> Questions{ get; set; } 
} 
public class QuestionVM 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public int SelectedAnswer { get; set; } 
    public List<Answer> PossibleAnswers { get; set; } 
} 

в контроллере, используйте ваш запрос .GroupBy() для создания вашей модели просмотра и добавления каждого раздела и связанных с ним вопросов/ответов

Затем добавьте EditorTempate для SectionVM

@model SectionVM 
@Html.HiddenFor(m = > m.ID) 
<h2>@Html.DisplayFor(m => m.Name)</h2> 
@Html.EditorFor(m => m.Questions) // uses an EditorTemplate for QuestionVM (i.e. as per your current ReportAnswers template 

и в главном окне

@Html.EditorFor(model => model.Sections) 
+0

Итак, вы говорите, что я должен отказаться от моего использования существующего шаблона редактора, который у меня есть сейчас? Кроме того, могу ли я использовать {get; set;} в viewmodel с первым приложением db? Думаю, я всегда думал, что для самой модели была модель с первым приложением? Или, может быть, это глупый вопрос? – Voyagr12

+0

Кроме того, я думаю, я не думал о том, чтобы делать .GroupBy() в контроллере ... Наверное, я могу это сделать? – Voyagr12

+0

Вы используете 'EditorTemplates' хорошо (и его легче читать, чем несколько вложенных циклов' for'). Но для того, чтобы представить то, что вы хотите отобразить в представлении, вам действительно нужно использовать модель представления, а не пытаться использовать ваши модели данных в представлении. В вашем случае у вас есть отчет, в котором содержится коллекция разделов, причем каждый раздел содержит сборник Вопросов, каждый из которых содержит набор возможных ответов. –