Как частичные представления обращаются к индексу массива, который находится в вызывающем методе? - PullRequest
2 голосов
/ 17 января 2011

Попытка выяснить, как MVC получает индекс массива в частичном представлении.

У меня есть следующий код для демонстрации.

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" },
                    }
                }
            });
        }
    }

Мое представление Index.aspx

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

My _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" />
 <% } %>

My Order.ascx

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

Следующий HTML-код отображается

<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>

Где выполняется Order.ascx получить доступ к индексу массива от его родителя?Я хочу иметь возможность установить индекс вручную для одного вызова ajax, чтобы я мог подделать значение приращения.

1 Ответ

1 голос
/ 21 января 2011

Кажется, что методы Html.EditorFor () используют отражение, чтобы получить контекст, из которого они выполняются, чтобы получить индекс текущего цикла.

Ответ заключается в том, чтобы установить HtmlFieldPrefix в TemplateInfo, чтобы ваши частичные представления имели к нему доступ.

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

Очевидно, что вы заменили бы числа значением тока для цикла или переменной счетчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...