2016-03-23 3 views
0
Speicher

ich eine Teilansicht, die in meiner Hauptansicht mit diesem CodeDynamische Teilansicht Liste aufgenommen nicht zu werden, wenn

<div> 
    <h3>Budget Detail</h3> 
    <div><input type="button" id="addbudgetdetail" value="Add row" /></div> 
    <div id="new-budgetdetail"> 
     @if (Model.budget != null) 
     { 
      foreach (var budgetdetail in Model.budget.budgetdetails) 
      { 
       @Html.Partial("budgetdetail", Model) 
      } 
     } 
     else 
     { 
      @Html.Partial("budgetdetail", Model) 

     } 
    </div> 
</div> 

Es gerendert wird ein Java-Script ist mehr Teilansichten dynamisch hinzuzufügen, wenn Klicken auf eine Schaltfläche

$(function() { 
    $('#addbudgetdetail').on('click', function() { 
     jQuery.get('@Url.Action("budgetdetail")').done(function (html) { 
      $('#new-budgetdetail').append(html); 
      $('form').data('validator', null); 
      $.validator.unobtrusive.parse($('form')); 
     }); 
    }); 
}); 

Dies ist meine Teilansicht:

@model BudgetPortalMVC4.Models.NewBudgetModel 
@{ 
    Layout = null; 
} 
<script src="../../Scripts/jquery.validate.js" type="text/javascript"></script> 
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"  type="text/javascript"></script> 
@using (Html.BeginCollectionItem("")) 
{ 
    @Html.ValidationSummary(true) 
    <div class="item"> 
     <table> 
      <tr> 
       <td> 
        @Html.LabelFor(m => m.SelectedCategory) 
        @Html.DropDownListFor(m => m.SelectedCategory, Model.CategoriesList, "Please select", new { @class = "SelectedCategory" }) 
        @Html.ValidationMessageFor(m => m.SelectedCategory) 
       </td> 
       <td> 
        @Html.LabelFor(m => m.SelectedSubCategory) 
        @Html.DropDownListFor(m => m.SelectedSubCategory, Model.SubCategoriesList, "Please select", new { @class = "SelectedSubCategory" }) 
        @Html.ValidationMessageFor(m => m.SelectedSubCategory) 
       </td> 
       <td> 
        @Html.LabelFor(model => model.budgetdetail.Amount)    
        @Html.EditorFor(model => model.budgetdetail.Amount) 
        @Html.ValidationMessageFor(model => model.budgetdetail.Amount) 
       </td> 
       <td><a href="#" id="deleteRow" class="deleteRow">Delete</a</td> 
      </tr> 
     </table> 
    </div> 
} 

Mein Problem ist, wenn ich mich einreichen klicken sehe keine Liste für meine Teilansichten. Ich kann nur die Daten sehen, die direkt von meiner Hauptansicht kommen.

Fehle ich irgendwo eine IEnumerable-Eigenschaft? Soll ich stattdessen Editor-Vorlagen verwenden?

+0

Sie können ein 'EditorTemplate' nicht mit' BeginCollectionItem() 'verwenden. Und entferne die Skripte von deinen partails. Deine "foreach" -Schleife macht keinen Sinn - ich nehme an, sie soll '@ Html.Partial (" budgetdetail ", budgetdetail) heißen, aber das" else "würde eine Ausnahme auslösen, wenn es so weit gekommen wäre –

Antwort

0

Ich habe dieses Problem gelöst. Ich musste die Modelle überarbeiten und anstatt ein großes Modell zu verwenden, das die Budget- und Budgetdetails gruppiert, verwende ich 2 Modelle, eines für Budget und eines für Budgetdetail.

Ich schrieb auch die Dropdown-Listen auf das neue Modell zu erfüllen:

ich eine Editor-Vorlage erstellt eine Teilansicht mit
@Html.LabelFor(m => m.category) 
      @Html.DropDownListFor(m => m.idCategory, new SelectList(ViewBag.CategoriesList, "idCategory", "CategoryName"), "Please select", new { @class = "SelectedCategory" }) 
      @Html.ValidationMessageFor(m => m.idCategory) 


    @Html.LabelFor(m => m.subcategory) 
      @Html.DropDownListFor(m => m.idSubcategory, new SelectList(ViewBag.SubCategoriesList, "Value", "Text"), "Please select", new { @class = "SelectedSubCategory" }) 
      @Html.ValidationMessageFor(m => m.idSubcategory) 

statt. Nach dem Hinweis von Stephen, dass BeginCollection nicht in Editor-Vorlagen verwendet werden kann, habe ich einen HTML-Helfer verwendet, um eindeutige Elemente in meiner Sammlung zu erstellen.

Dies ist der Code für die Helfer:

using System; 
using System.Collections.Generic; 
using System.Linq.Expressions; 
using System.Text; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 

namespace BudgetPortalMVC4.Extensions 
{ 

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString EditorForMany<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable<TValue>>> expression, string htmlFieldName = null) where TModel : class 
    { 
     var items = expression.Compile()(html.ViewData.Model); 
     var sb = new StringBuilder(); 

     if (String.IsNullOrEmpty(htmlFieldName)) 
     { 
      var prefix = html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix; 

      htmlFieldName = (prefix.Length > 0 ? (prefix + ".") : String.Empty) + ExpressionHelper.GetExpressionText(expression); 
     } 

     foreach (var item in items) 
     { 
      var dummy = new { Item = item }; 
      var guid = Guid.NewGuid().ToString(); 

      var memberExp = Expression.MakeMemberAccess(Expression.Constant(dummy), dummy.GetType().GetProperty("Item")); 
      var singleItemExp = Expression.Lambda<Func<TModel, TValue>>(memberExp, expression.Parameters); 

      sb.Append(String.Format(@"<input type=""hidden"" name=""{0}.Index"" value=""{1}"" />", htmlFieldName, guid)); 
      sb.Append(html.EditorFor(singleItemExp, null, String.Format("{0}[{1}]", htmlFieldName, guid))); 

     } 

     return new MvcHtmlString(sb.ToString()); 
    } 
} 
} 

Nun rufe ich die Vorlage aus dem Haupt eine Zwischen IEnumerable-Ansicht.

Dies ist der Anruf von der Hauptansicht:

@Html.EditorForMany(x => x.budgetdetails) 

Und das ist die Zwischen IEnumerable Ansicht:

@model IEnumerable<BudgetPortalMVC4.Models.budgetdetail> 

@{ 
Layout = null; 
    } 

    @Html.EditorForMany(x => x, "budgetdetails") 

Hope this hilfreich.

Verwandte Themen