2013-06-19 7 views

cevap

5

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> 
+0

'dan esinlenilmiştir, ancak EditorTemplate içindeki "i" yi nasıl bilebilirim? – Andrei

+0

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

+0

Bu işe yarayacak! :) Merak ettiğim tek şey, endeksin orası. Razor bunu biliyor. Birisi nasıl çıkartabilir? – Andrei

2

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 ...

+0

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

4

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.

4

nereden:

@using System 
@using System.Text.RegularExpressions 

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

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() 
0

Ben en kolay yolu olduğunu düşünüyorum

@Jona ve @Ryan Penfold'dan