2011-01-17 4 views
2

Versuchen herauszufinden, wie MVC den Index eines Arrays in einer Teilansicht erhält.Wie greifen Teilansichten auf den Index eines Arrays in der aufrufenden Methode zu?

Ich habe den folgenden Code zu demonstrieren.

public class HomeController : Controller { 

     public ActionResult Index() { 
      return View(new[] { 
       new Customer() { 
        Orders = new [] { 
         new Order() { Name="Shoes" }, 
         new Order() { Name="Socks" }, 
        } 
       }, 
       new Customer() { 
        Orders = new [] { 
         new Order() { Name="Pants" }, 
         new Order() { Name="Pantaloonies" }, 
        } 
       } 
      }); 
     } 
    } 

Meine Index.aspx Ansicht

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <%: Html.EditorForModel("_Customer") %> 
</asp:Content> 

Mein _Customer.ascx

<% using(Html.BeginForm("Index", "Home", FormMethod.Post)) { %> 
    <% for (int i = 0; i < Model.Length; i++) { %> 
     <% for (int i2 = 0; i2 < Model[i].Orders.Count(); i2++) { %> 
      <%= Html.EditorFor(m => m[i].Orders[i2], "Orders")%>  
     <% } %> 
    <% } %> 
    <input type="submit" value="submit" /> 
<% } %> 

Mein Order.ascx

<%= Html.LabelFor(m => m.Name) %> 
<%= Html.EditorFor(m => m.Name) %> 

Die folgende HTML wird

gemacht
<form action="/" method="post"> 
<label for="[0]_Orders[0]_Name">Name</label> 
<input class="text-box single-line" name="[0].Orders[0].Name" type="text" value="Shoes" /> 
<label for="[0]_Orders[1]_Name">Name</label> 
<input class="text-box single-line" name="[0].Orders[1].Name" type="text" value="Socks" /> 
<label for="[1]_Orders[0]_Name">Name</label> 
<input class="text-box single-line" name="[1].Orders[0].Name" type="text" value="Pants" /> 
<label for="[1]_Orders[1]_Name">Name</label> 
<input class="text-box single-line" name="[1].Orders[1].Name" type="text" value="Pantaloonies" /><input type="submit" value="submit" /> 
</form> 

Woher erhält Order.ascx Zugriff auf den Index des Arrays von seiner Eltern? Ich möchte in der Lage sein, den Index manuell für One-Off-Ajax-Anrufe festzulegen, so dass ich den Inkrementwert fälschen kann.

Antwort

1

Es scheint, dass die Html.EditorFor() - Methoden Reflektion verwenden, um den Kontext abzurufen, aus dem sie ausgeführt werden, um den Index der aktuellen Schleife abzurufen.

Die Antwort ist, das HtmlFieldPrefix in Ihrem TemplateInfo festzulegen, damit Ihre Teilansichten darauf zugreifen können.

ViewData.TemplateInfo.HtmlFieldPrefix = "[0] _Orders [1]"; %>

Offensichtlich würden Sie die Zahlen durch den Wert der aktuellen for-Schleife oder eine Zählervariable ersetzen.

Verwandte Themen