Olgu: Ben Sınıf X için Editör Şablon yardımıyla gösterilen Sınıf X öğe listesi varDüzenleyici Şablonunda dizi/dizi dizini nasıl alınır?
Sorun: Nasıl Editör Şablon iç tarafında işleniyor Ben bir öğenin dizinini alabilirim?
Olgu: Ben Sınıf X için Editör Şablon yardımıyla gösterilen Sınıf X öğe listesi varDüzenleyici Şablonunda dizi/dizi dizini nasıl alınır?
Sorun: Nasıl Editör Şablon iç tarafında işleniyor Ben bir öğenin dizinini alabilirim?
Her için bir for döngüsü kullanın ve dizinleyiciyi EditorFor
uzantısına geçirin; tıraş bıçağı gerisini halletmeli.
@for(var i = 0; i < Model.count(); i++)
{
@Html.EditorFor(m => Model.ToArray()[i], new { index = i })
}
Güncelleme: Yukarıdaki gösterisi olarak görüntüleme verilerini kullanarak öğenin endekste
pas. Sen @ Html.NameFor kullanabilirsiniz ViewBag
<span> Item Index: @ViewBag.index </span>
aracılığıyla editör şablon erişimi de
madde (m => m.AnyField). Bu ifade, dizin dahil olmak üzere tam ad özelliğini çıkaracaktır. Dizini oraya çıkarabilirsiniz ...
işaretinde doğru ad/id öznitelikleri üretmez, ancak doğrudan ayıklamak için daha iyi bir seçenek yoktur. Cevabımı aşağıya bakın. – iberodev
EditorTemplate'i kullanmak, bir şeylerin listesini içeren modelleri görüntülerken en iyi çözümdür.
Eğer Jilet varsayılan olarak ayarlar özelliğini kullanabilirsiniz işlenmiş alt modeli için endeksini bulmak amacıyla:
ViewData.TemplateInfo.HtmlFieldPrefix
Say, örneğin, aşağıdaki görünüm modelleri:
public class ParagraphVM
{
public int ParagraphId { get; set; }
public List<LineVM> Lines { get; set; }
}
ve
public class LineVM
{
public int Id { get; set; }
public string Text {get; set;}
}
ve bir içindeki tüm "LineVM" düzenlemek isterler "ParagraphVM". Bir Kontrolör en var varsayarsak
@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>
: (mevcut değil ise) Eğer alt modeli Views/Shared/EditorTemplates/LineVM.cshtml
olarakaynı isimde aşağıdaki klasörde bir görünüm yaratacak böylece Sonra Editör Şablon kullanmak istiyorsunuz o görünüm dönen ve örneğin Views/Paragraph/_Paragraph.cshtml
için, bir görünüme bir ParagrapghVM ViewModel geçiyor ActionResult:
@model MyProject.Web.MVC.ViewModels.Paragraphs.ParagraphVM
@using (Html.BeginForm("Details", "Paragraphs", FormMethod.Post))
{
@Html.EditorFor(p => p.Lines)
}
Bu görüş öğeleri olarak liste Lines gibi birçok kişi düzenleyebilir hale edeceğini listesini içerir. Örneğin bazı javascript kullanmak tam olarak hangi mevkide her ürün listesinde olup bilebilir önüne aldığımızda
<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>
: Örneğin, mülkiyet listesi ParagraphVM.Lines 3 öğe içeriyorsa Yani böyle bir şey kılabilecek Bir atlıkarınca ya da onunla ne yapmak istiyorsan onu yarat. Fakat bu listeyi düzenlemek için, Razor'un sizin için hallettiği pozisyonu bilmeniz gerekmediğini unutmayın. ParagrafVM modelini geri gönderirseniz, Hat listesi, herhangi bir ek çalışma yapılmadan (varsa) bağlı olan değerlere sahip olacaktır.
nereden:
@using System
@using System.Text.RegularExpressions
var i = Convert.ToInt32(Regex.Matches(
ViewData.TemplateInfo.HtmlFieldPrefix,
@"\[([0-9]+)?\]")[0].Groups[1].ToString());
Bir yineleme sadece gerekli kimliği döndüren bu HtmlExtension kullanıyorum. Temel olarak, son sayıyı yakalayan ViewData.TemplateInfo.HtmlFieldPrefix
numaralı bir regex.
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;
}
}
böyle bir EditorFor-şablonda kullanılabilir:
@Regex.Match(ViewData.TemplateInfo.HtmlFieldPrefix, @"(?!\[)\d+(?=\])")
Veya yardımcısı olarak:
public static string Index(this HtmlHelper html)
{
Match m = Regex.Match(html.ViewData.TemplateInfo.HtmlFieldPrefix, @"(?!\[)\d+(?=\])");
return m.Success ? m.Value : null;
}
@Html.Index()
@Jona ve @Ryan Penfold'dan
'dan esinlenilmiştir, ancak EditorTemplate içindeki "i" yi nasıl bilebilirim? – Andrei
EditorTemplate'de '@ Html.EditorFor' işlevini kullanırsanız, öğenin dizinini bilmeniz gerekmeyecek, Razor, öğeleri bir koleksiyona geri gönderecek şekilde uygun bir şekilde adlandıracaktır. Ancak, dizini başka bir şekilde kullanmak isterseniz, bunu ViewData'ya iletebilirsiniz. Düzenlemeler konusuna bakın. – Jay
Bu işe yarayacak! :) Merak ettiğim tek şey, endeksin orası. Razor bunu biliyor. Birisi nasıl çıkartabilir? – Andrei