MVC3 Razor Syntax. كيف يمكنني تحويل أسلوب ASP.NET إلى Razor. (أيضا مشكلات مع @ داخل اقتباسات)

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

سؤال

هل يمكن لأي شخص تحويل بناء جملة ASP.NET إلى بناء جملة الحلاقة؟ لا يمكنني تحويله "واحد إلى واحد" إلى بناء جملة الحلاقة.

<% Themes.ThemesAvailable().ForEach(i => 
   {
       if (i.Equals(Themes.ThemeToUse))
       {%>
         <a href="" id="A1" style="font-size:x-large;color:Red"><%:i%></a>
        <%}
       else
       {%>
        <a href="" style="color:Blue" id="ChangeThemeTo_<%:i%>"><%:i%></a>
       <%} %>
    <br />
<% });%>

ما يلي لا يعمل (يشكو من CS0201: فقط التعيينات والمكالمات والزيادة والانخفاض والكائن الجديد يمكن استخدام تعبيرات الكائنات كبيان)

@Themes.ThemesAvailable().ForEach(i => {
       if (i.Equals(Themes.ThemeToUse)){
         @:<a href="" id="A1" style="font-size:x-large;color:Red"> + @i + </a>
       ;}else{
         @:<a href="" style="color:Blue" id='ChangeThemeTo_@i'>@i</a>
       ;}   })

وهذا لا يعمل (فجأة يتوقع "}" في أعلى خط الصفحة 1 Col1)

@Themes.ThemesAvailable().ForEach(i => 
   {
       if (i.Equals(Themes.ThemeToUse)){
         @<text><a href="" id="A1" style="font-size:x-large;color:Red"> + @i + </a></text>
        ;} else {
         @<text><a href="" style="color:Blue" id='ChangeThemeTo_@i'>@i</a></text>
       ;}
})

يبدو أن I ضمن ID = 'ChangetHemeto_ @I' يمنع مجموعة النص النهائي من العمل. إذا قمت بإزالة العنصر "@" يعمل العنصر. ولكن احصل على نفس الخطأ مثل تجربة التحويل الأولى (CS0201).

إزالة استخدام Lambda ، هذا يعمل ، ولكن فقط إذا قمت بإزالة "@" من id = 'changethemeto_i'

        @foreach (var i in Themes.ThemesAvailable()){
            if (i.Equals(Themes.ThemeToUse)){
<a href="" id="A1" style="font-size:x-large;color:Red"> + @i + </a> } else {
<a href="" style="color:Blue" id='ChangeThemeTo_i'>@i</a> } }

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

المحلول

لشيء واحد أعتقد أن الإفراط في استخدامك للرمز @ يمنحك المشكلات. محاولة:

@foreach(var i in Themes.ThemesAvailable()) 
{
    if (i.Equals(Themes.ThemeToUse))
    {
        <text><a href="" id="A1" style="font-size:x-large;color:Red"> + @i + </a></text>
    } 
    else 
    {
       <text><a href="" style="color:Blue" id='ChangeThemeTo_@i'>@i</a></text>
    }
}

يحرر

للحصول على مشكلتك الأخيرة حيث لا تكتب سمات المعرف بشكل صحيح ، حاول استخدام string.format بدلاً من ذلك:

<a href="" style="color:Blue" id="@(string.Format("ChangeThemeTo_{0}", i))">@i</a>

أو ببساطة تسلسهم:

<a href="" style="color:Blue" id="@("ChangeThemeTo_" + i)">@i</a>

نصائح أخرى

يبدو أنك بحاجة إلى نص قبل الكود لجعل محلل العلامات يعمل

@foreach(var theme in Themes.ThemesAvailable()) {
    if (theme.Equals(Themes.ThemeToUse))
        <a href="" id="a1" style="font-size:x-large;color:Red">@theme</a>
    else
        <a href="" style="color:Blue" id="ChangeThemeTo_@(theme)">@theme</a>
}

ما ورد أعلاه هو كل ما هو ضروري لرمزك للعمل. سبب عدم الحاجة إلى استخدام text العلامة بسبب text هو مجرد علامة HTML نموذجية تشبه HTML بحيث يجبر المحلل المحلل على الذهاب إلى وضع HTML. نظرًا لأن علامة HTML حقيقية تفعل نفس الشيء الذي لا تحتاجه إلى استخدام النص. السبب الذي يجعلك بحاجة إلى استخدام @(theme) في علامة الهوية الخاصة بك لعلامة المرساة الثانية ، ربما تكون مشابهة لعنوان البريد الإلكتروني ويُطلب من المحلل المحلل أن يتجاهل أي شيء يشبه عنوان البريد الإلكتروني. يمكنك التحقق من ذلك من خلال المحاولة ChangeThemeTo_ @theme مع مساحة بين وسترى أنها تعمل. ال @() هل هناك لإجبار المترجم على التعرف على ما هو بين () كرمز. آمل أن يساعد هذا فهمك للمحلل أكثر قليلاً.

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