ケース: クラス X のエディター テンプレートを使用して表示されるクラス X のアイテムのリストがあります。
問題: エディタ テンプレート内で処理中の項目のインデックスを取得するにはどうすればよいですか?
ケース: クラス X のエディター テンプレートを使用して表示されるクラス X のアイテムのリストがあります。
問題: エディタ テンプレート内で処理中の項目のインデックスを取得するにはどうすればよいですか?
私は、反復の必要な ID のみを返すこの HtmlExtension を使用しています。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;
}
}
次のような EditorFor テンプレートで使用できます。
@Html.Index()
for each の代わりに for ループを使用し、インデクサーをEditorFor
拡張機能に渡します。かみそりは残りを処理する必要があります。
@for(var i = 0; i < Model.count(); i++)
{
@Html.EditorFor(m => Model.ToArray()[i], new { index = i })
}
アップデート:
上記のように、ビュー データを使用してアイテムのインデックスを渡します。
エディター テンプレートで、ViewBag を介してアイテムにアクセスします。
<span> Item Index: @ViewBag.index </span>
どうですか:
@using System
@using System.Text.RegularExpressions
var i = Convert.ToInt32(Regex.Matches(
ViewData.TemplateInfo.HtmlFieldPrefix,
@"\[([0-9]+)?\]")[0].Groups[1].ToString());
何かのリストを含むモデルを表示する場合は、EditorTemplate を使用するのが最適なソリューションです。
レンダリングされているサブモデルのインデックスを見つけるために、Razor が既定で設定するプロパティを使用できます。
ViewData.TemplateInfo.HtmlFieldPrefix
たとえば、次のビュー モデルがあるとします。
public class ParagraphVM
{
public int ParagraphId { get; set; }
public List<LineVM> Lines { get; set; }
}
と
public class LineVM
{
public int Id { get; set; }
public string Text {get; set;}
}
「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>
View を返し、ParagrapghVM ビューモデルをビューに渡す Controller の ActionResult があると仮定します。次に例を示しViews/Paragraph/_Paragraph.cshtml
ます。
@model MyProject.Web.MVC.ViewModels.Paragraphs.ParagraphVM
@using (Html.BeginForm("Details", "Paragraphs", FormMethod.Post))
{
@Html.EditorFor(p => p.Lines)
}
このビューは、アイテムがそのリストを含むのと同じ数のリスト Lines のエディターをレンダリングします。たとえば、プロパティ リスト 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>
これにより、各アイテムがリスト内のどの位置にあるかを正確に知ることができます。たとえば、javascript を使用してカルーセルを作成したり、それを使ってやりたいことをしたりできます。ただし、そのリストを編集するのに、Razor が処理してくれるので、実際にはその位置を知る必要はないことに注意してください。モデル ParagraphVM をポストバックすると、リスト Lines には追加の作業なしでバインドされた値 (存在する場合) が含まれます。
@Html.NameFor(m => m.AnyField) を使用できます。その式は、インデックスを含む完全な名前のプロパティを出力します。そこでインデックスを抽出できます...