2010-11-28 18 views
14

Jilet'de bir değişkene nasıl bir HTML parçası oluşturulur?Razor - bir değişkene içerik nasıl oluşturulur

<content var="t"> 
    <a class="tab" href="">Tab name</a> 
</content> 

<content var="tc"> 
    <div class="tabcontent"> 
     <p>Here goes tab content</p> 
    </div> 
</content> 

!{tabs(t, tc)} 

iki değişken sekme sayfasının içine içeriğinin tüm güzel sarma yapan bir makro geçirilen olsun: Kıvılcım ben aşağıdaki kodu yazmak için kullanılır.

Aynı şeyi Razor'da yapmanın en iyi yolu nedir?

Güncelleme: Anladım düşünüyorum .. Razor yılında

, @<text>...</text> yapı HTML bir parça atama uzun bir eşdeğer olan sonradan tekrar kullanılabilir lambda ifadeleri, üretmek için kullanıcı olabilir bir değişkene. Yukarıdaki örnek şu şekilde uygulanabilir:

Func<int, object> t = 
    @<text> 
     <a class="tab" href="">Tab name</a> 
    </text>; 

Func<int, object> tc = 
    @<text> 
     <div class="tabcontent"> 
      <p>Here goes tab content</p> 
     </div> 
    </text>; 


@tabs(t(0), tc(0)) 

Sadece parametresiz lambdas (Func<object>) yazmak için anlamaya olamaz. Yukarıdaki lambdalarda bulunan int parametresi bir kukladır. Razor'un bir parametre gerektirdiği görülüyor (ve ifade içinde belirtmek için zaten bir "öğe" oluşturuyor).

cevap

5

Belki HtmlString'i kullanabilirsiniz? Ben bu kadar seviyorsunuz, ama burada ne var tam bir çeviri olarak denemek yapardım ...

@{ 
    var t = new HtmlString("<a class='tab' href=''>Tab name</a>"); 
    var tc = new HtmlString("<div class='tabcontent'><p>Here goes tab content</p></div>"); 
} 
@tabs(t, tc) 

Yani bilmiyorum ... Ben senin Spark makro neye benzediğini bilmiyorum Ancak, Razor'da bir yardımcı kullanmak için bir fırsat gibi görünüyor. sayfanıza gelen şöyle olduğunu

@helper Tabs(string tabName, string tabContent) 
{ 
    <!-- some wrapper code --> 
    <a class="tab" href="">@(tabName)</a> 
    <!-- some more wrapper code --> 
    <div class="tabcontent"> 
     <p>@(tabContent)</p> 
    </div> 
    <!-- still more wrapper code --> 
} 

Ardından aramak: başkasının (benim yaptığım gibi) bu yayını bulur Her ihtimale karşı

@Tabs("Tab Name", "Here goes tab content") 
+0

teşekkürler, ne gerçekten ihtiyacım bir satır içi yardımcı sözdizimi olduğunu düşünüyorum. Bunun henüz Razor'da bulunmadığını biliyorum. Çözüm, açık bir yardımcıyı ilan etmek olabilir, bu da çağrılabilir ve sonuç bir değişkene atanabilir. – Andy

+0

Yukarıdaki yorumda hatalıydım. Sözdizimi kullanılabilir, açık yardımcılara gerek yoktur. Bunun yerine Lambda ifadeleri kullanılabilir. Güncellenmiş sorumu görün. – Andy

5

, Andy'nin Güncelleme neredeyse yoktur Sen gibi bir şey olabilir . Verilen örneğe ek olarak, verilen örnekte 'int' öğesine erişmek için yapmanız gereken tek şey referans @item'dur. @<text></text> bloklarında item değişkeni, çağrıldığı modeli içerir. muhtemelen bunun yerine böyle bir fonksiyonun kısmi bir görünüm kullanmalıdır

@model PageData 

@{ 
    Func<Customer, object> sayHi = 
     @<text> 
      <li>Hello @(item.FirstName)!</li> 
     </text>; 
} 

<ul> 
    @foreach(var customer in Model.Customers) 
    { 
     sayHi(customer); 
    } 
</ul> 

Çoğu örnekte:

Burada nasıl kullanılabileceğini gösteren bir örnek. Ancak nadir durumlarda kısmi bir görüşün mümkün olmadığı (örneğin RazorEngine kütüphanesi kullanıldığında), bu işe yarar.de görmekten remmebr, operatör: metin tek bir satır içinse

@{ 
    Func<dynamic, object> a = @<text> 
     Some Text   
    </text>; 
    @a(new object()) 
}  

sadece hatta "@" kullanabilirsiniz:

+0

Bilinen bir şey değil, teşekkürler! – Sel

7

Temelde OP zaten böyle bir şey yapabileceğini sorunu cevap aşağıdaki örnekte olduğu gibi, bir sonraki satırda (herhangi kapanış parantez veya parantez gerekiyorsa ya) bir noktalı virgül: Eğer

istiyorsanız

@{ 
    Func<dynamic, object> a = @: Some Text 
    ;  
    @a(new object()) 
} 

Ancak bir dize olarak doğrudan yakalayabilir

Hatta bir işlevde hapsetmek olabilir:

@functions{ 
    public string ToString(Func<dynamic, object> input) 
    { 
      return input("").ToString(); 
    } 
} 

@{ 
    string a = ToString(@<text> 
        Some Text 
       </text>); 
    @a //Output directly as a string   
} 
0

Eğer Jilet görünümünde bir IHtmlContentBuilder varsa, bu uzantıları kullanabilirsiniz.

public static IHtmlContentBuilder AppendRazor(this IHtmlContentBuilder htmlContentBuilder, Func<IHtmlContent, dynamic> lamda) 
    { 
     var html = lamda(null); 
     return htmlContentBuilder.AppendHtml(html); 
    } 

    public static IHtmlContentBuilder AppendRazor<T>(this IHtmlContentBuilder htmlContentBuilder, Func<T, IHtmlContent> lamda, T model) 
    { 
     var html = lamda(model); 
     return htmlContentBuilder.AppendHtml(html); 
    } 

Kullanımı

@{ 
    HtmlContentBuilder contentBuilder = new HtmlContentBuilder(); 
    contentBuilder.AppendRazor(@<text><p>Hello @Model.Name<p></text>); 
    contentBuilder.AppendRazor(@<text><p>Hello @item.CustomerName<p></text>, customer); 
} 
<div> 
    @contentBuilder 
</div> 
İlgili konular