如何在编辑器模板中获取序列/数组索引?

And*_*rei 14 asp.net-mvc razor asp.net-mvc-4 razor-2

案例:我有一个使用X类编辑器模板显示的X类项目列表.

问题:如何在编辑器模板内部获取正在处理的项目的索引?

小智 12

我一直在使用这个HtmlExtension只返回迭代所需的id.它基本上是一个关于ViewData.TemplateInfo.HtmlFieldPrefix捕获最后一个数字的正则表达式.

public static class HtmlExtensions
    public static MvcHtmlString Index(this HtmlHelper html)
    {
        var prefix = html.ViewData.TemplateInfo.HtmlFieldPrefix;
        var m = Regex.Match(prefix, @".+\[(\d+)\]");
        if (m.Success && m.Groups.Count == 2) 
            return MvcHtmlString.Create(m.Groups[1].Value);
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

可以在EditorFor-template中使用,如下所示:

@Html.Index()
Run Code Online (Sandbox Code Playgroud)


Jay*_*Jay 5

使用for循环而不是每个循环并将索引器传递到EditorFor扩展中; 剃刀应该处理剩下的事情.

@for(var i = 0; i < Model.count(); i++)
{
    @Html.EditorFor(m => Model.ToArray()[i], new { index = i })
}
Run Code Online (Sandbox Code Playgroud)

更新:

使用上面显示的视图数据传递项目的索引.

在您的编辑器模板中,通过ViewBag访问该项目

<span> Item Index: @ViewBag.index </span>
Run Code Online (Sandbox Code Playgroud)


ibe*_*dev 5

在查看包含某些内容列表的模型时,使用EditorTemplate是最佳解决方案.

为了找到正在渲染的子模型的索引,您可以使用Razor默认设置的属性:

ViewData.TemplateInfo.HtmlFieldPrefix
Run Code Online (Sandbox Code Playgroud)

比如说,您有以下视图模型:

public class ParagraphVM
{
    public int ParagraphId { get; set; }
    public List<LineVM> Lines { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

public class LineVM
{
    public int Id { get; set; }

    public string Text {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

并且您希望能够编辑"ParagraphVM"中的所有"LineVM".然后,您将使用编辑器模板,因此您将在以下文件夹(如果它不存在)中创建一个与子模型同名的视图Views/Shared/EditorTemplates/LineVM.cshtml:

@model MyProject.Web.MVC.ViewModels.Paragraphs.LineVM
@{
     //this will give you the List's element like Lines[index_number]
     var field = ViewData.TemplateInfo.HtmlFieldPrefix;
}
<div id="@field">
    @Html.EditorFor(l => l.Text)
</div>
Run Code Online (Sandbox Code Playgroud)

假设您有一个Controller的ActionResult,它返回一个View并将ParagrapghVM视图模型传递给视图,例如Views/Paragraph/_Paragraph.cshtml:

@model MyProject.Web.MVC.ViewModels.Paragraphs.ParagraphVM

@using (Html.BeginForm("Details", "Paragraphs", FormMethod.Post))
{
    @Html.EditorFor(p => p.Lines)
}
Run Code Online (Sandbox Code Playgroud)

此视图将为列表行呈现尽可能多的编辑器,因为项目包含该列表.因此,例如,如果属性列表ParagraphVM.Lines包含3个项目,它将呈现如下内容:

<div id="#Lines[0]">
   <input id="Lines_0__Text name="Lines[0].Text"/>
</div>
<div id="#Lines[1]">
   <input id="Lines_1__Text name="Lines[1].Text"/>
</div>
<div id="#Lines[2]">
   <input id="Lines_2__Text name="Lines[2].Text"/>
</div>
Run Code Online (Sandbox Code Playgroud)

通过它,您可以准确地知道每个项目在列表中的位置,例如使用一些javascript来创建轮播或任何您想要用它做的事情.但请记住,要编辑该列表,您并不需要知道Razor为您处理它的位置.如果您回发模型ParagraphVM,列表行将具有绑定的值(如果有),而无需任何其他工作.


Rya*_*old 5

怎么样:

@using System
@using System.Text.RegularExpressions

var i = Convert.ToInt32(Regex.Matches(
             ViewData.TemplateInfo.HtmlFieldPrefix,
             @"\[([0-9]+)?\]")[0].Groups[1].ToString());
Run Code Online (Sandbox Code Playgroud)