سؤال

هل من الممكن أن يكون لديك قالب مع محتوى HTML في VM لمكون كتلة؟

أقوم بالكثير من الأشياء في HTML ، وأريد أن يقيم HTML في .vm ، وليس في CodeBehind.

هذا ما لدي:

    public class TwoColumn : ViewComponent
    {
    public override void Render()
    {
    RenderText(@"
     <div class='twoColumnLayout'>
      <div class='columnOne'>");
     // Context.RenderBody();
    Context.RenderSection("columnOne");
    RenderText(@"
      </div>
      <div class='columnTwo'>");
      Context.RenderSection("columnTwo");
    RenderText(@"
      </div>
     </div>
    ");
    }
   }

إليك ما أريد الحصول عليه: pagewithtwocolumns.vm:

#blockcomponent(TwoColumn)
 #columnOne
  One
 #end
 #columnTwo
  Two
 #end
#end

twocolumn/default.vm (pseudocode):

<div class="twoColumnLayout">
 <div class="columnOne">
  #reference-to-columnOne
 </div>
 <div class="columnTwo">
  #reference-to-columnTwo
 </div>
</div>
هل كانت مفيدة؟

المحلول

لديك RenderView طريقة على الفئة الأساسية من ViewComponent. ما يمكنك فعله هو استخدام الحمل الزائد الذي يكتب العرض في مكانه في كتاب Textwriter.

ما عليك سوى التمسك بهذه الطريقة في ViewComponent ويجب القيام بها

string RenderViewInPlace(string viewTemplate)
{
    var buffer = new StringBuilder();
    using (var writer = new StringWriter(buffer))
    {
        RenderView("myview", writer);
        return buffer.ToString();
    }           
}

نصائح أخرى

لقد وجدت أخيرًا حلاً باستخدام تقنية StringWriter المقترحة من Ken ، ولكن بطريقة مختلفة. إنه ليس عرضًا ، إنه عرض

public override void Render()
{
    PropertyBag["sectionOneText"] = RenderSectionInPlace("sectionOne");
    PropertyBag["sectionTwoText"] = RenderSectionInPlace("sectionTwo");
    base.Render();
}

public string RenderSectionInPlace(string sectionName)
{

    var stringBuilder = new StringBuilder();
    Context.RenderSection(sectionName, new StringWriter(stringBuilder));
    return stringBuilder.ToString();
}

قالب:

<div class="twoColumnLayout">
 <div class="columnOne">
  $sectionOneText
 </div>
 <div class="columnTwo">
  $sectionTwoText
 </div>
</div>

أود أن أقترح ميزة لمونوريل ، إذا كنت لا تمانع. سيكون من الرائع أن تكون قادرًا على الرجوع إلى القسم من قالب العرض مثل هذا:

#render(sectionOne)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top