2016-04-20 12 views
-3

ich eine MVC-Anwendung, in der ich SQL von einem ADO.Net Entity Data Model zu bekommen versuchen, hinter dieser Seite in meinen index.cshtmlASP.Net MVC-Anwendung mit SQL

My home-Controller-Controller angezeigt werden soll:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Data; 
using System.Data.Entity; 
using TemplateBootstrap.Models; 

namespace TemplateBootstrap.Controllers 
{ 
    public class HomeController : Controller 
    { 
     private DBEntities db = new DBEntities(); 

     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult About() 
     { 
      ViewBag.Message = "Your app description page."; 
      return View(); 
     } 

     public ActionResult Contact() 
     { 
      ViewBag.Message = "Your contact page."; 
      return View(); 
     } 
    } 
} 

in meinem index.cshtml gibt es eine Menge von HTML zur Zeit ich in meinen Navigationsschriften hart codiert bin und Inhalten, die 1/2 innerhalb von 5 Tabellen meiner Datenbank zum Beispiel Hauptnavigation 1/2, Seiten Navigation gespeichert sind und Inhalt.

Unten ist die SQL-Anweisung, die für MainNavLevel1 verwendet wird. SELECT [MNavID], [DisplayLabel],[Priority] FROM [MainNavLevel1] ORDER BY [Priority]"

Dies ist ein Beispiel Ich verwende eine Tabelle ohne SQL-Code.

controller: namespace TemplateBootstrap.Controllers 
{ 
    public class NavigationController : Controller 
    { 
     private AskHoltsEntities db = new AskHoltsEntities(); 

     public ActionResult Index() 
     { 
      return View(db.AH_Corp_MainNavLevel1.ToList()); 
     } 
    } 
} 

dieser Ansicht:

@model IEnumerable<TemplateBootstrap.Models.AH_Corp_MainNavLevel1> 
@{ 
    ViewBag.Title = "Index"; 
} 
<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th>@Html.DisplayNameFor(model => model.DisplayLabel)</th> 
     <th>@Html.DisplayNameFor(model => model.URL)</th> 
     <th>@Html.DisplayNameFor(model => model.Priority)</th> 
     <th></th> 
    </tr> 
@foreach (var item in Model) { 
    <tr> 
     <td> @Html.DisplayFor(modelItem => item.DisplayLabel) </td> 
     <td> @Html.DisplayFor(modelItem => item.URL)</td> 
     <td> @Html.DisplayFor(modelItem => item.Priority)</td> 
    </tr> 
} 
</table> 

Ich brauche Hilfe der Code oder Ergänzungen (Klasse) zu ändern, machte meine SQL-Anweisungen setzen die Daten aus mehreren Tabellen abgerufen werden.

+1

Irgendwelche Ideen über was? – ElGavilan

+1

Was versuchst du zu tun? Sie müssen angeben, was auf Ihrer Seite angezeigt werden soll, damit wir das Ziel verstehen. –

+0

Was ist das Problem? –

Antwort

2

Grundlegende ADO.NET-Verbindungen haben sich in MVC nicht wirklich geändert. Sie verlassen sich immer noch auf Dinge wie SqlConnection Objekte und ihre zugeordneten Befehle, die Sie ohne Problem in MVC verwenden können (solange Sie eine Verbindungszeichenfolge haben).

Wenn Sie eine einfache Abfrage erstellen wollten, könnte es wie folgt aussehen, wenn Sie eine bestimmte Tabelle (die in Ihrem Kontext nicht sein könnte) innerhalb Ihrer Controller-Aktion (oder eine abstrahierte Klasse, die behandeln würde) Datenzugriff ausschließlich):

// Build your connection 
using(var connection = new SqlConnection("{your-connection-string-here"})) 
{ 
    // Build your query 
    var query = "SELECT [MNavID], [DisplayLabel],[Priority] FROM [MainNavLevel1] ORDER BY [Priority]"; 
    // Create a command to execute your query 
    using(var command = new SqlCommand(query,connection)) 
    { 
      // Open the connection 
      connection.Open(); 

      // Execute your query here (in this case using a data reader) 
      using(var reader = command.ExecuteReader()) 
      { 
       // Create a list of items to use in your View (assumes this class exists) 
       var navigationLabels = new List<NavigationLabel>(); 

       // Iterate through your results 
       while(reader.Read()) 
       { 
         // Build a navigation item for each row returned from 
         // your query 
         navigationLabels.Add(new NavigationLabel(){ 
          MNavID = reader["MNavID"], 
          DisplayLabel = reader["DisplayLabel"], 
          Priority = reader["Priority"] 
         }); 
       } 

       // Pass your labels to your View 
       return View(navigationLabels); 
      } 
    } 
} 

Dies setzt voraus, dass Sie eine Klasse, die Ihre Datenbankstruktur tatsächlich imitiert und enthält ähnliche Eigenschaften, die Sie NavigationLabel in diesem Fall zuordnen.

Wenn Sie waren so etwas wie Entity Framework und hatte bereits diese Entitäten, dann könnte man vermutlich so etwas wie den folgenden Code verwenden, um Ihre entsprechenden Elemente aus dem Kontext zu ziehen:

using(var context = new DbEntities()) 
{ 
     var navigationLabels = context.NavigationLabels 
            .OrderBy(n => n.Priority) 
            .ToList(); 
     return View(navigationLabels); 
} 
+0

Hallo ist dieser Code in meinem Controller? Da bin ich mir nicht sicher, wohin das gehen soll? – TerrorTot38

+1

Ja, Sie können es in Ihren Controller einfügen (oder wenn Sie es lieber etwas abstrahieren, können Sie eine andere Klasse für den Datenzugriff einrichten und sie über diese Klasse aufrufen). –

+0

Es wäre besser, wenn Sie es abstrakt trennen die Datenschicht von der Geschäftslogik – jamiedanq

0

Zuerst müssen Sie Ihr erklären ApplicationDbContext-Objekt. (Hinweis: Der ApplicationDbContext wird von Ihrer Verbindungszeichenfolge in Ihrer startup.cs abgeleitet oder wo auch immer Sie sie haben.) Ich habe tatsächlich eine Schritt für Schritt Tutorial Tutorial bei http://blog.meemsit.com/post/2016/04/03/how-to-make-a-mvc-web-application-using-asp-net5-mvc-6-and-entity-framework-7 Ich denke, dies könnte einige Ihrer tieferen Fragen, die Sie möglicherweise beantworten haben.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Data; 
using System.Data.Entity; 
using TemplateBootstrap.Models; 

namespace TemplateBootstrap.Controllers 
{ 
    public class HomeController : Controller 
    { 
     //private DBEntities db = new DBEntities(); 
     //This will provide your context to your HomeController 
     private readonly ApplicationDbContext _context; 

    //Then declare your public context. 
    public HomeController(ApplicationDbContext context) 
    { 
     _context = context; 
    } 

     public ActionResult Index() 
     { 
      return View(_context.MainNavLevel1.ToList()); 
     } 

     public ActionResult About() 
     { 
      ViewBag.Message = "Your app description page."; 
      return View(); 
     } 

     public ActionResult Contact() 
     { 
      ViewBag.Message = "Your contact page."; 
      return View(); 
     } 
    } 
} 

auf Ihre Index.cshtml Dann gehen Sie und Ihr Modell an der Spitze anrufen und Html Helfer verwenden, um die Informationen anzuzeigen.

@model IEnumerable<TemplateBootstrap.Models.MainNavLevel1> 


<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.DisplayLabel) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Priority) 
     </th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.DisplayLabel) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Priority) 
     </td> 
    </tr> 
} 
</table> 

und Sie sollten eine ApplicationDbContext Klasse in Ihren Modellen Ordner haben, die ist, wo Sie fluentAPI verwenden würden spezielle Dinge zu definieren, wie dies sollte verdrahtet werden.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using Microsoft.AspNet.Identity.EntityFramework; 
using Microsoft.Data.Entity; 
using TemplateBootstrap.Models; 

namespace TemplateBootstrap.Models 
{ 
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
     protected override void OnModelCreating(ModelBuilder builder) 
     { 
      base.OnModelCreating(builder); 
      //Put SQL Statements Here 
      // Customize the ASP.NET Identity model and override the defaults if needed. 
      // For example, you can rename the ASP.NET Identity table names and more. 
      // Add your customizations after calling base.OnModelCreating(builder); 
     } 
     public DbSet<Product> Product { get; set; } 
    } 
} 
+0

Hallo, meine Anwendung mag ApplicationDbContext _context nicht; Weißt du, warum das sein könnte? – TerrorTot38

+0

Welchen Teil mag es nicht, den ApplicationDbContext oder den _context? –