我正在尝试这样做: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”等等但我不明白该集合是如何跟踪并生成这些索引的。
答案 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" />
<% } %>
一旦你尝试了这个,你可以通过解释症状回来询问你是否有任何问题。