2012-10-11 43 views
5

¿Es posible agregar el código HTML a una sección de maquinilla de afeitar existente?Añadir código HTML a una sección Razor existente

A continuación es mi escenario:

Mi _layout.cshtml contiene algo como esto:

@RenderSection("BottomSection", required: false) 

y en una de las vistas - _article.cshtml, he definido la sección, como a continuación:

@section BottomSection 
{ 
<script src='~/Scripts/module/article_details.js' type='text/javascript'></script> 
<script src='~/Scripts/module/modal.js' type='text/javascript'></script> 
@MvcHtmlString.Create(Model.ExtraStuff) 
} 

y en una vista parcial llamada _counter.cshtml, que se utiliza en la vista anterior; Me gustaría agregar más código HTML a la misma sección, es decir, BottomSection.

he intentado declarar la sección BottomSection de nuevo en la vista parcial:

@section BottomSection{ 
<text>More data</text> 
} 

pero no funcionó.

¿Hay alguna forma de lograr esto? ¿Agregar dinámicamente más código a una sección de afeitadora ya definida en MVC 4? Tenga en cuenta que la vista parcial no espera datos de la vista/modelo principal. Y estoy usando MVC 4 con .Net Framework 4.0/VS2010.

Respuesta

-3

Usando Ajax puede cargar la vista parcial y puede renderizar en su división objetivo.

Trate de usar jquery ajax

 $.ajax({ 
      type: 'GET', 
      url: '@Url.Action("Action","Controller")', 
      cache: false, 
      timeout: 20000, 
      contentType: "application/json; charset=utf-8", 
      success: function (_results) { 
       $("#TargetDiv").html(_results); 
      }, 
      error: function (_results) { 

      } 
     }); 
+0

favor decir por qué esta solución es erróneo. He intentado lo mismo para agregar el html recién generado a la vista ya procesada – amesh

+0

Gracias por su respuesta, pero esto no es lo que quería hacer. La vista parcial puede agregar más referencias de contenido/script, etc. Obtener los datos agregará una solicitud de ida y vuelta y hasta entonces mi página no funcionará. – Kay

-2

Tal vez yo no entiendo su pregunta, pero ¿por qué usted no utilizar vistas parciales anidados ???

por ejemplo:

PartialView1

`<script src='~/Scripts/module/article_details.js' type='text/javascript'></script> 
<script src='~/Scripts/module/modal.js' type='text/javascript'></script> 
@MvcHtmlString.Create(Model.ExtraStuff) 
@{Html.RenderPartial("PartialView2",Model.ExtraStuff);}` 

PartialView2

`<text>More data</text>` 
+0

Tener múltiples vistas parciales resolverá el problema. Pero, esto terminará teniendo muchos archivos de vista parcial para mí, desafiando el propósito del enfoque dinámico. – Kay

0

No sé cómo anexar cosas a las secciones (de hecho me gustaría saber que yo mismo), pero conozco un truco que podría producir un resultado similar. En lugar de usar secciones, puede usar TempData. TempData es muy similar a ViewBag, pero una vez que se establece una variable, vivirá allí para el usuario actual hasta que intente acceder a ella nuevamente (puede vivir a través de unas pocas solicitudes sucesivas para el usuario actual, por lo que se recomienda precaución). A continuación hay un ejemplo de cómo podría usarse.

En el diseño:

@Html.Raw(new MvcHtmlString((string)TempData["BottomSection"])); 

En la vista:

@{ 
    var bottomSection = (string)TempData["BottomSection"]; 
    if (bottomSection == null) 
    { 
     bottomSection = ""; 
    } 
    bottomSection += "<script src='~/Scripts/module/article_details.js' type='text/javascript'></script>\n"; 
    bottomSection += "<script src='~/Scripts/module/modal.js' type='text/javascript'></script>\n"; 
    bottomSection += Model.ExtraStuff + "\n"; 
    TempData["BottomSection"] = bottomSection; 
} 

En la vista parcial:

@{ 
    var bottomSection = (string)TempData["BottomSection"]; 
    if (bottomSection == null) 
    { 
     bottomSection = ""; 
    } 
    bottomSection += "More data"; 
    TempData["BottomSection"] = bottomSection; 
} 

Esto se puede mejorar aún más por escribir un ayudante para aquellas secciones seudo y \ o moviendo los contenidos de las secciones a parciales separados (mira debajo).

bottomSection += Html.Partial("_StuffToAddToSection").ToString(); 

Clase auxiliar:

public static class PseudoSectionsHelper 
{ 
    public static MvcHtmlString AppendToPseudoSection<T>(this TempDataDictionary TempData, string sectionName, T model, Func<T, HelperResult> content, bool addNewLineCharacter = true) 
     where T : class 
    { 
     return AppendToPseudoSection(TempData, sectionName, content(model).ToString(), addNewLineCharacter); 
    } 

    public static MvcHtmlString AppendToPseudoSection(this TempDataDictionary TempData, string sectionName, MvcHtmlString content, bool addNewLineCharacter = true) 
    { 
     return AppendToPseudoSection(TempData, sectionName, content.ToString(), addNewLineCharacter); 
    } 

    public static MvcHtmlString AppendToPseudoSection(this TempDataDictionary TempData, string sectionName, string content, bool addNewLineCharacter = true) 
    { 
     var section = (string)TempData[sectionName]; 
     if (section == null) 
     { 
      section = ""; 
     } 
     else if (addNewLineCharacter) 
     { 
      section += "\n"; 
     } 
     section += content; 
     TempData[sectionName] = section; 
     // We return empty MvcHtmlString to be able to use this helper inline (without declaring code block @{ some code... } in view) 
     return new MvcHtmlString(""); 
    } 

    public static MvcHtmlString PseudoSection(this TempDataDictionary TempData, string sectionName) 
    { 
     var section = (string)TempData[sectionName]; 
     return new MvcHtmlString(section); 
    } 
} 

Uso ejemplo

En Diseño de complemento:

@TempData.PseudoSection("BottomSection") 

En vista:

@TempData.AppendToPseudoSection("BottomSection", Model, @<text> 
    <script src='~/Scripts/module/article_details.js' type='text/javascript'></script> 
    <script src='~/Scripts/module/modal.js' type='text/javascript'></script> 
    @MvcHtmlString.Create(Model.ExtraStuff) 
</text>) 

o

@{ 
    TempData.AppendToPseudoSection("BottomSection", Model, @<text> 
     <script src='~/Scripts/module/article_details.js' type='text/javascript'></script> 
     <script src='~/Scripts/module/modal.js' type='text/javascript'></script> 
     @MvcHtmlString.Create(Model.ExtraStuff) 
    </text>); 
} 

o incluso

@TempData.AppendToPseudoSection("BottomSection", Html.Partial("BottomSectionScriptsAndStuff")) 

Y en parciales:

@TempData.AppendToPseudoSection("BottomSection", "More data") 
+0

Usar System.Web.HttpContext.Current.Items en lugar de TempData podría ser una idea aún mejor, ya que TempData vive mientras no lo lea, lo que puede provocar situaciones extrañas (como una sección que no se procesó) en una página, se renderiza en otra). – jahu

Cuestiones relacionadas