2017-02-02 3 views
1

У меня есть частичный вид внутри формы, которая добавляется к форме каждый раз, когда нажимается кнопка. Это текстовая область с набором ответов. Как я могу передать свою модель из представления в контроллер, добавить ее в модель списка и вернуться к просмотру?Как пройти модель от View до Controller, добавить элементы в список, перейти назад к виду

Я передаю обзорFormViewModel Я хочу передать ListAdhoc на частичный контроллер и добавить элементы к нему, а затем передать его обратно в представление.

public class ReviewFormViewModel 
{ 
    ...// other fields 
    public List<AdhocViewModel> ListAdhoc { get; set; } 
} 

public class AdhocViewModel 
{ 
    public int? ReviewId { get; set; } 
    public String AdhocQuestion { get; set; } //free form 
    public int? SelectedAnswer { get; set; } // for binding int? for optional 
    public String Comments { get; set; } 
    public List<AdhocOptionsVM> ListAdhocOptions { get; set; } 
} 

public class AdhocOptionsVM 
{ 
    public int AnswerId { get; set; } 
    public String RatingName { get; set; } 
    public Decimal Rating { get; set; } 
    public String ActiveFl { get; set; } 

} 

контроллера для частичного вида

public PartialViewResult Adhoc() 
    { 
     //pass model object on button click and add each item to the model everytime 
     var AdhocObj = new AdhocViewModel(); 

     AdhocObj.ListAdhocOptions = new List<AdhocOptionsVM>(); 
     var query = db.dbQuestionOptions.Where(qo => qo.ActiveFl == "Y").OrderByDescending(qo => qo.Rating).ToList(); 

     foreach (var item in query) 
     { 
      var AdhocAnsOptionsVMObj = new AdhocOptionsVM(); 
      AdhocAnsOptionsVMObj.AnswerId = item.AnswerId; 
      AdhocAnsOptionsVMObj.RatingName = item.RatingName; 
      AdhocAnsOptionsVMObj.Rating = item.Rating; 
      AdhocAnsOptionsVMObj.ActiveFl = item.ActiveFl; 

      AdhocObj.ListAdhocOptions.Add(AdhocAnsOptionsVMObj); 
     } 


     return PartialView("Adhoc", AdhocObj); 
} 

и частичного вида, который использует ReviewFormViewModel Aswell:

<div class="adhoc"> 
@using (Html.BeginCollectionItem("adhoc")) 
{ 
    <div class="panel panel-success"> 
     <div class="panel-heading"> 
      @Html.HiddenFor(m => m.ReviewId) 
      @Html.HiddenFor(m => m.AdhocId) 

      @Html.TextAreaFor(m => m.AdhocQuestion, htmlAttributes: new { @style = "width:650px", @placeholder = "Enter Adhoc Question here" })<br /> 
     </div> 
     <div class="panel-body"> 
      @foreach (var optAnswer in Model.ListAdhocOptions) 
      { 
       <div class="radio"> 
        <responselabel>@Html.RadioButtonFor(m => m.SelectedAnswer, optAnswer.AnswerId, new { id = optAnswer.AnswerId }) @optAnswer.RatingName</responselabel><br /> 
       </div> 
      } 
      <div>@Html.ValidationMessageFor(m => m.SelectedAnswer)</div><br /> 

      @Html.TextAreaFor(m => m.Comments, htmlAttributes: new { @style = "width:650px", @placeholder = "Comments" })<br /><br /> 
     </div> 
     <button type="button" class="delete">Delete</button> 
    </div> 

} 

Основного вид

@model CustomerFeedback.Areas.ProjectManagers.Models.ReviewFormViewModel 

@{ 
    ViewBag.Title = "CreateFormsIndex"; 
} 

<h4 align="center">Project Review Form</h4> 

<div class="container-fluid"> 
    <div class="row"> 
     <div class="col-md-12"> 
      <div class="text-center"> 
       <h4> 
        @Html.DisplayName(Model.ProjectId) @Html.DisplayName(Model.ProjectName) 
       </h4> 
       <h4> 
        PM: @Html.DisplayName(Model.FullName) 
       </h4> 
      </div> 
     </div> 
    </div> 
</div> 

<div class="container"> 
    <br /> 
    <div class="panel-group"> 
     @using (Html.BeginForm()) 
     { 

      @Html.AntiForgeryToken() 
      @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
      @Html.HiddenFor(m => m.ProjectId) 
      @Html.HiddenFor(m => m.AccountId) 
      @Html.HiddenFor(m => m.ReviewDate) 

      <div class="panel panel-default"> 
       <div class="panel-body"> 
        <div class="panel-group"> 
         <div class="panel-heading"> 
          <h4 class="panel-title"> 
           Required Questions 
          </h4> 
         </div> 
         @for (int i = 0; i < Model.ListReqQuestions.Count; i++) 
         { 
          <div class="panel panel-success"> 
           <div class="panel-heading"> 
            @Html.HiddenFor(m => m.ListReqQuestions[i].QuestionId) 
            @Html.DisplayFor(m => m.ListReqQuestions[i].QuestionText) 
           </div> 
           <div class="panel-body"> 
            @foreach (var optAnswer in Model.ListReqQuestions[i].ListQuestionOptions) 
            { 
             <div class="radio"> 
              <responselabel>@Html.RadioButtonFor(m => m.ListReqQuestions[i].SelectedAnswer, optAnswer.AnswerId, new { id = optAnswer.AnswerId }) @optAnswer.RatingName</responselabel><br /> 
             </div> 
            } 
            <div>@Html.ValidationMessageFor(m => m.ListReqQuestions[i].SelectedAnswer)</div><br /> 

            @Html.TextAreaFor(m => m.ListReqQuestions[i].Comments, htmlAttributes: new { @style = "width:650px", @placeholder = "Comments" })<br /><br /> 
           </div> 
          </div> 
         } 

         <div class="panel-heading"> 
          <h4 class="panel-title"> 
           Optional Questions 
          </h4> 
         </div> 
         @for (int i = 0; i < Model.ListOpQuestions.Count; i++) 
         { 
          <div class="panel panel-success"> 
           <div class="panel-heading"> 
            @Html.HiddenFor(m => m.ListOpQuestions[i].QuestionId) 
            @Html.DisplayFor(m => m.ListOpQuestions[i].QuestionText) 
           </div> 
           <div class="panel-body"> 
            @foreach (var optAnswer in Model.ListOpQuestions[i].ListQuestionOptions) 
            { 
             <div class="radio"> 
              <responselabel>@Html.RadioButtonFor(m => m.ListOpQuestions[i].SelectedAnswer, optAnswer.AnswerId, new { id = optAnswer.AnswerId }) @optAnswer.RatingName</responselabel><br /> 
             </div> 
            } 
            <div>@Html.ValidationMessageFor(m => m.ListOpQuestions[i].SelectedAnswer)</div><br /> 

            @Html.TextAreaFor(m => m.ListOpQuestions[i].Comments, htmlAttributes: new { @style = "width:650px", @placeholder = "Comments" })<br /><br /> 
           </div> 
          </div> 
         } 
         @*on click (new adhoc question) add a new freeform question with list of answers*@ 
         <div class="panel panel-success" id="adhoc"> 
          @* renders partial adhoc view *@ 
         </div> 
         <br /> 
         <div class="center"> 
          <input type="button" value="New Adhoc Question" class="btnAdhoc btn-success" /> 
         </div> 
         <br /> 
         <div class="center"> 
          <input type="submit" value="Save" name="Command" class="btn btn-success" /> 
          <input type="submit" value="Submit" name="Command" class="btn btn-success" /> 
          <input type="submit" value="Cancel" name="Command" class="btn btn-success" /> 
          <input type="submit" value="Attach" name="Command" class="btn btn-success" /> 
         </div> 

        </div> 
       </div> 
      </div> 
     } 
    </div> 
</div> 

<script> 

    $(function() { 

     $('.btnAdhoc').click(function (event) { 
      event.preventDefault(); 

      $.ajax({ 
       url: '/ProjectManagers/Forms/Adhoc', 
       //data: JSON.stringify(model), 
       type: 'get', 
       success: function (result) { 
        $('#adhoc').append(result); 
       } 
      }); 
     }); 
    }) 
</script> 

UPDATE: Я добавил AdhocViewModel.

Ive добавила модель обзора для этих свойств. У меня есть форма с набором вопросов и ответов, на которые нужно ответить. Это из базы данных. У меня есть кнопка, при щелчке будет генерировать частичный вид и добавить к форме (может быть много). Частичный вид состоит из текстовой области (для любого введенного вопроса), набора ответов (из базы данных) и окна комментариев. Я не уверен, как справиться с этим на почте (submit). Моя попытка - передать модель из представления в частичный контроллер, добавить элементы к нему и передать его обратно в представление для обработки. Я не имею никакого успеха на прохождение модели данных

UPDATE 2 Обновленного код с использованием помощника BeginCollectionItem. Добавлено основное представление

+0

Трудно понять, что вы пытаетесь сделать здесь. Нет, где в вашем частичном случае вы показали что-либо, относящееся к свойствам «ListAdhoc» –

+0

. Но вы утверждали, что частичное использование 'ReviewFormViewModel', которое явно не основано на вашем коде, - это должно быть' @model AdhocViewModel' –

+0

И если это частичное для «AdhocViewModel» это бессмысленно, потому что «ReviewFormViewModel» содержит коллекцию «AdhocViewModel» и для создания элементов управления для коллекции, в которой им нужны индексы, и ваши частичные не будут этого делать. –

ответ

1

Причина, по которой коллекция не связана, связана с тем, что параметр в BeginCollectionItem() должен соответствовать имени вашего свойства. Измените его на

@using (Html.BeginCollectionItem("ListAdhoc")) // binds to List<AdhocViewModel> ListAdhoc 

Кроме того, вы также должны цикл в главном окне, чтобы сделать существующие AdhocViewModel в коллекции. Даже если ни один из них не существует изначально, он по-прежнему требуется, если вам нужно вернуть представление, потому что ModelState недействителен. В главном виде:

<div class="panel panel-success" id="adhoc"> 
    @foreach(var item in Model.ListAdhoc) 
    { 
     @Html.Partial("Adhoc", item) 
    } 
</div> 
Смежные вопросы