2015-07-30 14 views
5

Jiletli sözdizimi ile bir lambda ifadesinin (temsilci, Eylem, Func <>) içeriğini tanımlamak mümkün mü, bu görünümde bu yöntem yürütüldüğünde, bu Razor içeriğine eklenecek mi?Bir lambda fonksiyonunun Razor sözdizimini içermesi ve bir Görünümde yürütülmesi mümkün mü?

Bunun amaçlanan amacı, geliştiricilerin CustomControl görünümünün belirli bir noktasına eklenecek kendi özel içeriğini tanımlayabilmeleridir.

Aşağıdaki, şu andaki düzenimi taklit eden örnek bir kod içermektedir. Odaklamanın belirli bölümleri, RenderSideContent yöntem tanımlaması ve yürütme çağrısıdır.

Index.cshtml

@model My.PageModel 

@My.CustomControl(new CustomControlModel 
    { 
     AreaTitle = "Details", 
     RenderSideContent =() => 
     { 
      <div> 
       @using (My.CustomWrapper("General")) 
       { 
        My.BasicControl(Model.Controls[0]) 
       } 
      </div> 
     } 
    }) 

CustomControl.cshtml

<div> 
    @Model.AreaTitle 
    <div class="my-custom-content"> 
     @Model.RenderSideContent() 
    </div> 
</div> 

cevap

3

Evet ve hayır. Hayır, özel Razor'u böyle besleyemezsiniz, çünkü bu bağlamda düz C# ile uğraşıyorsunuz ve <div> gibi bir şey geçerli C# değil. Ancak, , veya MvcHtmlString nesnesini lambda'da oluşturabilir ve döndürür.

Ancak, HTML işlemek karşı HTML dönmek özel denetimlerin sürümlerini oluşturmak için ihtiyacımız olacak. Temel olarak, Html.Partial vs Html.RenderPartial'u düşünün. Eski aslında cevabı yazar, ikincisi ise sadece bir sayfa olacak şekilde bir MvcHtmlString döndürür.

+0

I Sorun buydu, etrafta benzer bir yol olup olmadığını bilmiyordu. Takımımın iplerini el ile oluşturmasını gerektirmeden, Razor sözdizimini bir şekilde doğrudan enjekte etmenin bir yolu olsaydı iyi olurdu. Şu an için bir sarıcı işlevi uyguladım ve bir Html.Partial içinde karıştırdım. – haferje

2

O Templated Jilet temsilci'ı kullanarak, mümkündür:

@{ 
    Func<dynamic, object> b = @<strong>@item</strong>; 
} 
<span>This sentence is @b("In Bold").</span> 

@<text>...</text> biçimidir. Jilet derleyici bir lambda ifadesi oluşturacak. Şu anda ASP.Net Çekirdek kullanıyorum, bu yüzden şuna benzer:

item => new Microsoft.AspNetCore.Mvc.Razor.HelperResult(async(__razor_template_writer) => {...} 

Yani bu çalışması gerekir: Ayrıca

@model My.PageModel 

@My.CustomControl(new CustomControlModel 
    { 
     AreaTitle = "Details", 
     RenderSideContent = 
      @<div> 
       @using (My.CustomWrapper("General")) 
       { 
        My.BasicControl(Model.Controls[0]) 
       } 
      </div> 
    }) 

http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx/

bakınız: Are lambda expressions supported by Razor?

İlgili konular