2012-04-08 11 views
1

in der asp.net verwenden, wenn ich Masterpages verwendet, kann ich Masterpage-Code verwenden, um Aktiencodes auszuführen. in der MVC wie kann ich es tun. Alle Seiten verwenden layout.cshtml, aber es gibt keinen Share-Controller.Wie kann ich Datenbankdaten in der Layout.cshtml

in meinem Layout Ich habe einige Daten, die aus der Datenbank geladen werden müssen, aber es ist nicht überall diesen Code zu schreiben und füllt viewbag Daten zu senden

<div class="page"> 
    <header > 
     <div id="title"> 
      <h1>Management</h1> 
     </div> 
     <div id="logindisplay"> 
      @Html.Partial("_LogOnPartial") 
     </div> 
    <br /> 
    <br /> 
     <nav> 
      <ul id="menu"> 
         // these data must load from db 
      </ul> 
     </nav> 
    </header> 
    <section id="main"> 
     @RenderBody() 
    </section> 
    <footer> 
    </footer> 
</div> 

Antwort

3

Im freigegebenen Verzeichnis legen Sie alle Ihre Dateien (wie Masterseiten und Teilansichten), die in Ihrer Webanwendung verwendet werden, hoffentlich in einer Situation, in der sie mehr als einmal verwendet werden (für Teilansichten). Es gibt keinen gemeinsamen Controller, aber Sie könnten einen CommonController erstellen, der Dinge wie Ihr Menü verarbeiten kann.

Ich weiß nicht, welche anderen Daten Sie in Ihrer Ansicht anzeigen müssen, aber wenn Sie Ihr Beispiel betrachten, scheint es, als ob Sie Menüelemente in einem ul-Tag anzeigen möchten.

würde ich eine Klasse, die einen Menüpunkt wie darstellen würde:

public class MenuItem 
{ 
    public int MenuId { get; set; } 
    public string MenuName { get; set; } 
} 

ich immer für jede Ansicht eine Ansicht Modell erstellen. Das ist besser, weil Sie dann nur die Felder haben, die für die Ansicht benötigt werden. Senden Sie Ihre Domänenobjekte niemals direkt an die Ansicht.

Ein Ansichtsmodell würde so aussehen, es kann viele andere Eigenschaften enthalten, aber für diese Demo werde ich nur die meu Elemente einschließen.

public class MyViewModel 
{ 
    // This will contain the menu items that you want displayd in your view 
    public IEnumerable<MenuItem> MenuItems { get; set; } 
} 

Sie Aktionsmethode (in einem Controller genannt etwas wie CommonController):

public ActionResult MyActionMethod 
{ 
    MyViewModel viewModel = new MyViewModel 
    { 
      // Here you do a database call to populate your menu items 
      // This GetAllMenuItems method returns a list of MenuItem objects 
      MenuItems = menuItemService.GetAllMenuItems() 
    }; 

    return View(viewModel); 
} 

eine Teilansicht erstellen, der seine Daten aus CommonController erhalten wird (Sie dies mit dem Aktionsmethode oben erstellen müssen) . Durchlaufen Sie jedes MenuItem in MenuItems und zeigen Sie den Namen in einem li-Tag an.

<ul> 

    @foreach (var item in Model.MenuItems) 
    { 
      <li>item.MenuName</li> 
    } 

</ul> 

Ich hoffe, das hilft. Den Rest überlasse ich dir und erledige den Rest und lese weitere Artikel. Es gibt viele Informationen im Internet, die beschreiben, was Sie tun möchten. Sie müssen nur in Zeit investieren, um diese Artikel zu lesen.

+0

perfekt, ich ging dies völlig in die falsche Richtung. – GrahamHull

+0

@Brendan Sie sagen, man sollte View-Modell anstelle von Datenmodell verwenden, dann wie soll ich fortfahren, wenn ich Daten mit View Model in DB hinzufügen möchte, da Daten nur mit Datenmodell mit Entity Framework gespeichert werden können. Korrigieren Sie mich, wenn ich falsch liege – Steve

0

Es gibt ein paar Optionen layout.cshtml. Sie können entweder eine Teilansicht (mit eigenem Controller und Ansichtsmodell) oder einen Basiscontroller verwenden. Mit einem Basis-Controller würde jeder Controller es als Vorfahr verwenden und Sie können den Basis-Controller verwenden, um allgemeine Datenelemente zu laden.

0

Ich weiß, dass dieser Beitrag alt ist, aber ich hatte das gleiche Problem plötzlich bekam ich, dass wir leicht auf VB im Layout-Formular zugreifen können mit Razor arbeite ich mit vb. Sie können diesen Code für C# ändern. Ich verwende @Imports System.Data.SqlClient. Dieser Code funktioniert perfekt für mich und ich möchte genau das, was Sie

   <li class="treeview"> 
        <a href="#"> 
         <i class="fa fa-indent"></i> 
         <span>Transaction</span> <i class="fa fa-angle-left pull-right"></i> 

         <span class="label label-primary pull-right"></span> 
        </a> 
        <ul class="treeview-menu scrollbar"> 
         @Code 
          Using conn As New SqlConnection(connectionString) 
           Dim sSql = "SELECT * FROM SM_OBJECT_INFO WHERE menu_name = 'Transaction' Order By group_index, index_no" 
           Dim formname As String 
           Dim formtitle As String 
           Dim cmd As SqlCommand = New SqlCommand(sSql, conn) 
           conn.Open() 
           Dim rst As SqlDataReader = cmd.ExecuteReader 
           Do While rst.Read() 
            formname = rst!form_name 
            formtitle = rst!object_name 
            @<li><a [email protected]>@formtitle</a></li> 
           Loop 
          End Using 
         end code 
        </ul> 
       </li> 
+0

Das ist eine schreckliche Idee - Öffnen einer Datenbankverbindung, nachdem wir den Controller verlassen haben, ist fehleranfällig und außerhalb der normalen Fehlerrouten. Ich glaube nicht, dass MVC neu routen kann, wenn die Ansicht nicht gerendert werden kann. Schlecht. Und Db Stuff ist fehleranfällig. –

0

Dieser Artikel ist für mich- arbeitete unten beschreiben i in schildert in dem freigegebenen Verzeichnis schreibe Sie alle Ihre Dateien setzen (wie Masterseiten und Teilansichten), die in Ihrer Webanwendung verwendet werden, hoffentlich in einer Situation, in der sie mehr als einmal verwendet werden (für Teilansichten). Es gibt keinen gemeinsamen Controller, aber Sie könnten einen CommonController erstellen, der Dinge wie Ihr Menü verarbeiten kann.

Ich weiß nicht, welche anderen Daten Sie in Ihrer Ansicht anzeigen müssen, aber wenn Sie Ihr Beispiel betrachten, scheint es, als ob Sie Menüelemente in einem ul-Tag anzeigen möchten.

würde ich eine Klasse, die einen Menüpunkt wie darstellen würde:

public class MenuItem 
{ 
    public int MenuId { get; set; } 
    public string MenuName { get; set; } 
} 

ich immer für jede Ansicht eine Ansicht Modell erstellen. Das ist besser, weil Sie dann nur die Felder haben, die für die Ansicht benötigt werden. Senden Sie Ihre Domänenobjekte niemals direkt an die Ansicht.

Ein Ansichtsmodell würde so aussehen, es kann viele andere Eigenschaften enthalten, aber für diese Demo werde ich nur die meu Elemente einschließen.

public class MyViewModel 
{ 
    // This will contain the menu items that you want displayd in your view 
    public IEnumerable<MenuItem> MenuItems { get; set; } 
} 

Sie Aktionsmethode (in einem Controller genannt etwas wie CommonController):

public ActionResult MyActionMethod 
{ 
    MyViewModel viewModel = new MyViewModel 
    { 
      // Here you do a database call to populate your menu items 
      // This GetAllMenuItems method returns a list of MenuItem objects 
      MenuItems = menuItemService.GetAllMenuItems() 
    }; 

    return View(viewModel); 
} 

eine Teilansicht erstellen, der seine Daten aus CommonController erhalten wird (Sie dies mit dem Aktionsmethode oben erstellen müssen) . Durchlaufen Sie jedes MenuItem in MenuItems und zeigen Sie den Namen in einem li-Tag an.

<ul> 

    @foreach (var item in Model.MenuItems) 
    { 
      <li>item.MenuName</li> 
    } 

</ul> 

Ich hoffe, das hilft. Den Rest überlasse ich dir und erledige den Rest und lese weitere Artikel. Es gibt viele Informationen im Internet, die beschreiben, was Sie tun möchten. Sie müssen nur in Zeit investieren, um diese Artikel zu lesen.


Dies ist ein sehr nützlicher Artikel, um Asp.net Masterseiten-Funktionalität in MVC zu erreichen. Wenn wir eine Funktionalität haben wollen, die für jede Seite üblich ist [jeder Controller/View in MVC], müssen diese Artikelschritte folgen. Ich konfrontiert einmal Problem, das in diesem Artikel nicht erwähnt wird unter- teilen Wenn wir Teilansicht erstellen, die auf _layout Seite aufgerufen werden wird in jeder Ansicht zu teilen .. wir hasen zu schreiben - @ {Html.RenderAction ("BindMenu", "Common");} auf _Layout-Seite. Da ich Neuling war und ich versuchte, Teilansicht like- @ Html.Partial ("~/Ansichten/Shared/_HeaderMenuPartial.cshtml", Model.MenuItemsList) , die nicht funktionierte.

Verwandte Themen