使用EditorFor()动态地将项添加到MVC2中的集合

时间:2010-07-12 20:38:46

标签: asp.net asp.net-mvc-2 asp.net-ajax

我正在尝试这样做:Editing a variable length list, ASP.NET MVC 2-style

在帖子中他提到可以用较少的代码使用Html.EditorFor()完成,但由于索引会更难。嗯,这正是我想要做的,我不知道从哪里开始。

我是一名ASP.NET新手,刚刚在工作中跳入项目之前完成了Nerd Dinner教程,所以任何帮助都会受到赞赏。

更新1:我不想为集合中的每个项目生成GUID,而是生成从0开始的增量索引。现在,字段名称看起来像“gifts [GUID]。值”;我希望它们是“gift [0] .value”,“gifts 1。value”等等但我不明白该集合是如何跟踪并生成这些索引的。

2 个答案:

答案 0 :(得分:1)

为了回应有关生成索引而不是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);

希望这有助于其他人!

答案 1 :(得分:0)

嗯,首先定义一个编辑器模板(~/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" />
<% } %>

一旦你尝试了这个,你可以通过解释症状回来询问你是否有任何问题。