ASP.NET MVC 3 Razor: القسم محدد ولكن لم يتم تقديمه خطأ

StackOverflow https://stackoverflow.com/questions/4262045

  •  27-09-2019
  •  | 
  •  

سؤال

لدي قالب التصميم التالي:

<div id="columns" class="@View.LayoutClass">
    <div id="mainColWrap">
        <div id="mainCol">
            @RenderBody()
        </div>
    </div>
    @if (View.ShowLeftCol){
    <div id="leftCol">
        @RenderSection("LeftCol", required: false)
    </div>
    }
    @if (View.ShowRightCol){
    <div id="rightCol">
        @RenderSection("RightCol", required: false)
    </div>
    }
</div>

إذا تم عرض view.showleftcol أو view.showrightcol على خطأ ، أحصل على الخطأ التالي:


تم تعريف الأقسام التالية ولكن لم يتم تقديمها لصفحة التخطيط "~/views/shared/_layout.cshtml": "rightcol".


أحاول الحصول على قالب تخطيط واحد بدلاً من محاولة تحديد قالب في وقت التشغيل ديناميكيًا. هل هناك طريقة لتجاهل هذا الخطأ ومواصلة التقديم؟ هل يمكن لأي شخص أن يفكر في طريقة أخرى للتنفيذ من شأنها أن تسمح لي بإظهار/إخفاء الأعمدة ديناميكيًا مع الحلاقة؟

شكرًا!

هل كانت مفيدة؟

المحلول

أعطيت اقتراحا على ASP.NET المنتديات التي تعمل.

في الأساس ، إذا قمت بتحديد stection leftcol في قالب عرضي ولكن لا تقم بتشغيل أي رمز يستدعي التقديم في تخطيطي ، فأنا أحصل على الخطأ لأنه لا يتم استدعاؤه عند عرض. showleftcol خاطئة. كان الاقتراح هو إضافة كتلة أخرى ورمي بشكل أساسي أي محتويات موجودة في قسم اليسار.

@if (View.ShowLeftCol)
{ 
<div id="leftCol"> 
    @RenderSection("LeftCol", false) 
</div> 
}
else
{
    WriteTo(new StringWriter(), RenderSection("LeftCol", false));
}

بناءً على القلق الذي أثيرت بشأن الذاكرة ، قررت اختبار ما يلي أيضًا. في الواقع يعمل أيضا.

@if (showLeft)
{
    <section id="leftcol">
        <div class="pad">
            @RenderSection("LeftColumn", false)
        </div>
    </section>
}
else
{
    WriteTo(TextWriter.Null, RenderSection("LeftColumn", false));
}

أيضًا ، في الجزء العلوي من صفحتي ، هذا هو منطقي الجديد لـ Showleft/Showright:

bool showLeft = IsSectionDefined("LeftColumn");
bool showRight = IsSectionDefined("RightColumn");
bool? hideLeft  = (bool?)ViewBag.HideLeft;
bool? hideRight = (bool?)ViewBag.HideRight;
if (hideLeft.HasValue && hideLeft.Value == true) { showLeft = false; }
if (hideRight.HasValue && hideRight.Value == true) { showRight = false; }

قال شخص آخر إنه لم ينجح لهم ، لكنه عمل مثل سحر بالنسبة لي.

نصائح أخرى

@using System.Reflection;
@{
    HashSet<string> renderedSections = typeof(WebPageBase).GetField("_renderedSections", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField).GetValue(this) as HashSet<string>;
}

ثم أضف إلى هذا التجزئة تعيين أي اسم القسم الذي تريد التظاهر بأنه قدم.

@if (View.ShowLeftCol)
{ 
<div id="leftCol"> 
    @RenderSection("LeftCol", false) 
</div> 
}
else{  <!-- @RenderSection("LeftCol", false) -->  }

طريقة أسهل !!

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