none
MVC C# DB Tabelle Inhalt wird in View nicht angezeigt. Select liefert immer 0 RRS feed

  • Frage

  • Hallo Forum,

    ich habe eine Tabelle in der DB um einen Eintrag erweitert.

    Haben das Feld auch im Model zu der Tabelle angegeben / ergänzt.

    Die View auch ergänzt. Alles ok.

    Aber im Controller wird der Select zwar auch wie zuvor ohne Fehler ausgeführt,

    aber das neue Feld hat immer den Wert 0 ?  In der DB ist diese Feld aber mit diversen Werten gefüllt.

    der Select in dem Controller geht so :

    var x = db.Protokoll.ToList();

    return View(x);

    Was habe ich vergessen ? Muss ich das neue Feld noch wo "deklarieren" ausser in dem Model ?

    Hat jemand eine Idee woran das liegen kann ?


    Gruß Roland

    Samstag, 22. Dezember 2018 15:06

Antworten

  • Hallo Roland,

    für ein Formular, dass auch file Felder beinhaltet, musst Du den enctype auf multipart/form-data umstellen.

    @using( Html.BeginForm( "...", "...", null, FormMethod.Post, new { enctype = "multipart/form-data" } ) )

    Evtl. ist das bei dir das Problem. Ohne diese Angabe kann man die gesendeten Dateiinhalte nicht auslesen bzw. werden diese gar nicht erst vom Browser gesendet.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Roland DE Freitag, 28. Dezember 2018 09:36
    Mittwoch, 26. Dezember 2018 09:51
    Moderator
  • Hi Roland,
    ergänzend zu Stefans Antwort:

    Hast Du die File-Eigenschaft der Klasse Dokument hinzugefügt, die Du mit dem EF aus der Datenbank erzeugt hast? Wenn ja, was für einem Datenbanktyp soll dann HttpPosteFileBase entsprechen?

    Wenn Dokument eine eigene Klasse ist (nicht mit dem EF erzeugt), wie wird dann ein Objekt vom Typ "Dokument" beim Create übergeben? Wenn da beispielsweise "File" fehlt, wird auch nichts zurück geliefert.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Roland DE Freitag, 28. Dezember 2018 09:36
    Mittwoch, 26. Dezember 2018 12:08

Alle Antworten

  • Hi Roland,
    im Controller übergibst Du der View eine IEnumerable, mit der die anzuzeigenden Objekte geliefert werden. Darin muss natürlich das neue Feld auch gefüllt vorhanden sein. Da hast Du vermutlich irgend etwas vergessen.

    Zeig mal Deinen Code.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks


    Samstag, 22. Dezember 2018 21:15
  • Hallo Peter,

    habe herausgefunden, das das Feld bereits bei der Suche mit

    var x = db.Protokoll.ToList();

    eine 0 enthielt, was ich überhaupt nicht verstehe.

    Habe dann das Model kpl. gelöscht und aus der Datenbank neu geladen.

    Dann hat es funktioniert wie ich es eigentlich erwartet habe und das Feld war mit den Daten gefüllt.


    Gruß Roland

    Montag, 24. Dezember 2018 15:28
  • Hi Roland,
    warum nutzt Du ToList? Der Render-Prozess durchläuft die Elemente einmal und da reicht ein IEnumerable, welches die Datenbankabfrage liefern kann, z.B. so:

      public class HomeController : Controller
      {
    
        private KundenContext ctx;
    
        public HomeController(KundenContext context) { ctx = context; }
    
        public IActionResult Index()
        {
          return View(from k in ctx.Kunden select k);
        }
    ...


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks


    Montag, 24. Dezember 2018 17:50
  • Hallo Peter,

    habe wieder das gleiche Problem. Habe im Model für einen Datei Upload public HttpPostedFileBase File { get; set; }

    hinzugefügt.

    Im controller sieh es so aus :

     [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create([Bind(Include = "ID,DOK_DEB_ID,DOK_Typ,DOK_Bez,DOK_Bemerkung,DOK_BLOB,DOK_Extender,DOK_CreateDate,DOK_REBetrag,DOK_RENummer,DOK_VNummer,DOK_VGueltigBis,DOK_ZugangCode,InputFileName,File")] Dokumente dokumente)
            {
                if (ModelState.IsValid)
                {
                    db.Dokumente.Add(dokumente);
                    db.SaveChanges();
    
    
                    // Dokument speichern
                    byte[] uploadedFile = new byte[dokumente.File.InputStream.Length];
                    dokumente.File.InputStream.Read(uploadedFile, 0, uploadedFile.Length);
    

    habe bei Include File hinzu gefügt.

    In der View

    <div class="form-horizontal">
        <h4>Dokumente</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    
    
        <div class="form-group">
            @Html.LabelFor(model => model.InputFileName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <input type="file" name="File" required />
            </div>
        </div>
    

    Das Ergebnis wenn ich ein Neues Dokument anhängen will sieht so aus.

    Key InputFileName und File sind nicht vorhanden ?

    Was mache ich falsch ?


    Gruß Roland

    Dienstag, 25. Dezember 2018 11:13
  • Hallo Roland,

    für ein Formular, dass auch file Felder beinhaltet, musst Du den enctype auf multipart/form-data umstellen.

    @using( Html.BeginForm( "...", "...", null, FormMethod.Post, new { enctype = "multipart/form-data" } ) )

    Evtl. ist das bei dir das Problem. Ohne diese Angabe kann man die gesendeten Dateiinhalte nicht auslesen bzw. werden diese gar nicht erst vom Browser gesendet.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Roland DE Freitag, 28. Dezember 2018 09:36
    Mittwoch, 26. Dezember 2018 09:51
    Moderator
  • Hi Roland,
    ergänzend zu Stefans Antwort:

    Hast Du die File-Eigenschaft der Klasse Dokument hinzugefügt, die Du mit dem EF aus der Datenbank erzeugt hast? Wenn ja, was für einem Datenbanktyp soll dann HttpPosteFileBase entsprechen?

    Wenn Dokument eine eigene Klasse ist (nicht mit dem EF erzeugt), wie wird dann ein Objekt vom Typ "Dokument" beim Create übergeben? Wenn da beispielsweise "File" fehlt, wird auch nichts zurück geliefert.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Roland DE Freitag, 28. Dezember 2018 09:36
    Mittwoch, 26. Dezember 2018 12:08
  • Hallo Stefan, hallo Peter,

    DANKE für die Hinweise. Es funktioniert jetzt.


    Gruß Roland

    Freitag, 28. Dezember 2018 09:35