2016-06-15 3 views
1

В WebForms, я мог бы создать компонент, где я мог бы встраивать мое собственное содержаниеMVC частичный вид с пользовательского контента

Пример

<uc:BootstrapModal Title="Hello World" Size="Large"> 
    <h1>Hello World</h1> 
</uc:BootstrapModal> 

<!--generates this...--> 

<div class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog"> 
    <div class="modal-dialog modal-lg"> 
     <div class="modal-content"> 
      <h1>Hello World</h1> 
     </div> 
    </div> 
</div> 

Как я могу это сделать в MVC?

+1

Если вы При использовании MVC 6 вы можете создавать компоненты вида. Я становлюсь горячим, только думая о них. https://docs.asp.net/ru/latest/mvc/views/view-components.html – JDupont

+0

@JDupont Я на самом деле наделал это. Увы, я использую MVC 5 (пока). Из того, что я видел в MVC 6 до сих пор, я не могу дождаться, когда спустится и потупится! – series0ne

+0

вы можете использовать дочерние действия вместо частичных представлений, если хотите динамический контент – tmg

ответ

4

Вы можете создать метод расширения HtmlHelper для создания прилагаемого html, аналогично тому, как BeginForm() генерирует теги <form></form>.

using System; 
using System.Web.Mvc; 

namespace YourAssembly.Html 
{ 
    public class Dialog : IDisposable 
    { 
     private readonly ViewContext _viewContext; 
     private bool _disposed; 

     public Dialog(ViewContext viewContext) 
     { 
      if (viewContext == null) 
      { 
       throw new ArgumentNullException("viewContext"); 
      } 
      _viewContext = viewContext; 
     } 
     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 
     protected virtual void Dispose(bool disposing) 
     { 
      if (!_disposed) 
      { 
       _disposed = true; 
       DialogExtensions.EndDialog(_viewContext); 
      } 
     } 
     public void EndDialog() 
     { 
      Dispose(true); 
     } 
    } 

    public static class DialogExtensions 
    { 
     public static Dialog BeginDialog(this HtmlHelper htmlHelper) 
     { 
      return DialogHelper(htmlHelper); 
     } 
     private static Dialog DialogHelper(this HtmlHelper htmlHelper) 
     { 
      TagBuilder div = new TagBuilder("div"); 
      div.AddCssClass("modal fade bs-example-modal-lg"); 
      div.MergeAttribute("tabindex", "-1"); 
      div.MergeAttribute("role", "dialog"); 
      htmlHelper.ViewContext.Writer.Write(div.ToString(TagRenderMode.StartTag)); 

      div = new TagBuilder("div"); 
      div.AddCssClass("modal-dialog modal-lg"); 
      htmlHelper.ViewContext.Writer.Write(div.ToString(TagRenderMode.StartTag)); 

      div = new TagBuilder("div"); 
      div.AddCssClass("modal-content"); 
      htmlHelper.ViewContext.Writer.Write(div.ToString(TagRenderMode.StartTag)); 

      Dialog modal = new Dialog(htmlHelper.ViewContext); 
      return modal; 
     } 

     public static void EndDialog(this HtmlHelper htmlHelper) 
     { 
      EndDialog(htmlHelper.ViewContext); 
     } 

     internal static void EndDialog(ViewContext viewContext) 
     { 
      viewContext.Writer.Write("</div>"); 
      viewContext.Writer.Write("</div>"); 
      viewContext.Writer.Write("</div>"); 
     } 

    } 
} 

и с точки зрения использования его в качестве

@using (Html.BeginDialog()) 
{ 
    // add the content to be rendered in the dialog here 
} 

Примечание: В файле web.config добавить пространство имен вашего узла, так что вы не должны включать @using заявления в представлении.

<namespaces> 
    <add namespace="System.Web.Mvc" /> 
    .... 
    <add namespace="YourAssembly.Html" /> <!--add--> 
</namespaces> 

И тогда вы можете расширить это за счет создания дополнительных перегрузок, например, вы могли бы также иметь параметры для string title и ButtonType buttons (перечисление) для визуализации заголовка и кнопок колонтитула в диалоговом