Динамически добавлять элементы в коллекцию в MVC2, используя EditorFor () - PullRequest
2 голосов
/ 13 июля 2010

Я пытаюсь сделать это: Редактирование списка переменной длины в стиле ASP.NET MVC 2

В посте он упоминает, что это можно сделать с помощью меньшего количества кода с использованием Html.EditorFor (), но это будет сложнее из-за индексов. Ну, это именно то, что я хочу сделать, и я не знаю, с чего начать.

Я новичок в ASP.NET, который только что закончил учебник Nerd Dinner перед тем, как приступить к работе над проектом, поэтому любая помощь будет принята.

Обновление 1: Вместо того, чтобы генерировать GUID для каждого элемента в коллекции, я бы хотел сгенерировать инкрементные индексы, начиная с 0. Сейчас имена полей выглядят как "подарки [GUID] .value. «; Мне бы хотелось, чтобы они были "gifts [0] .value", "gifts 1 .value" и т. Д., Но я не понимаю, как коллекция отслеживает и генерирует эти индексы.

Ответы [ 2 ]

1 голос
/ 09 июля 2013

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

html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix

Итак, я написал вспомогательную функцию для анализа индекса (и если возникнет проблема, будет сгенерирован GUID)

public static string GetCollectionItemIndex(this HtmlHelper html, string collectionName)
     {
     int idx;
     string sIdx;

     if (Int32.TryParse(Regex.Match(html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix, @"\d+").Value, out idx))
        {
        sIdx = idx.ToString();
        }
     else
        {
        sIdx = Guid.NewGuid().ToString();
        }

     return sIdx;
     }

Я отредактировал функцию BeginCollectionItem (..), чтобы вызвать эту вспомогательную функцию при установке индекса элемента:

     string itemIndex = idsToReuse.Count > 0 ? idsToReuse.Dequeue() : GetCollectionItemIndex(html, collectionName);

Надеюсь, это поможет кому-то еще!

0 голосов
/ 13 июля 2010

Итак, вы начинаете с определения шаблона редактора (~/Views/Shared/EditorTemplates/Gift.ascx):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.Gift>" %>
<div class="editorRow">
    <% using(Html.BeginCollectionItem("gifts")) { %>
        Item: <%= Html.TextBoxFor(x => x.Name) %> 
        Value: $<%= Html.TextBoxFor(x => x.Price, new { size = 4 }) %> 
    <% } %>
</div>

А затем замените вызов RenderPartial на EditorForModel:

<% using(Html.BeginForm()) { %>
    <div id="editorRows">
        <%= Html.EditorForModel() %>
    </div>
    <input type="submit" value="Finished" />
<% } %>

После того, как вы попробовали это, вы можете вернуться и спросить, есть ли у вас проблемы с объяснением симптомов.

...