Entwickler-Ecke

ASP.NET und Web - Einführung in ASP.NET MVC


georgeboy - Fr 13.11.20 16:51
Titel: Einführung in ASP.NET MVC
Hallo zusammen, ich bin neu in ASP.NET MVC, kenne mich in WebForms aus, und möchte mich mit dem MVC Modell mit C# befassen. Leider finde ich keine Literatur bzw Tutorial dafür, nach langem Suchen. Folgende kleine Funktionalität: Auf dem Server liegt eine Datei mit Strings, beim Client eine Textbox, und ein Button. Beim draufclicken soll eine Meldung erscheinen, ob die Eingabe in der Datei enthalten ist oder nicht. Wie realisiere ich das mit dem MVC Modell ? Wenn sich jemand meiner erbarmen würde ...


georgeboy - So 15.11.20 16:38

Wie greift man vom Controller aus, auf den Inhalt einer TextBox, auf der View zu ?


jfheins - So 15.11.20 21:53

Ich kann dazu diese Videoserie empfehlen: https://channel9.msdn.com/Series/Introduction-to-ASP-NET-MVC/01

Zitat:
Wie greift man vom Controller aus, auf den Inhalt einer TextBox, auf der View zu ?

So pauschal gar nicht.

In asp.net MVC hast du HTTP dazwischen. Das heißt, ohne JS Spielereien schickst du HTML zum Browser, der zeigt eine Textbox an. Und mit dem Submit eines Formulars wird dein C#-Code wieder aufgerufen. Wenn du dazwischen eingreifen willst, musstt du JS oder JS+wasm bemühen.

In der Controller-Methode die von dem Button aufgerufen wird kannst du einfach einen Parameter so nennen wie die Textbox, die Daten kommen dann da rein.


georgeboy - Mo 16.11.20 15:49

Bei VS 2019 Community ASP.NET MVC Controller, konnte ich die TextBox mit der Id nicht ansprechen ...


jfheins - Mo 16.11.20 21:23

Nix für ungut, aber wie soll man da jetzt helfen?

"Es geht nicht" ist höchstens der erste Teil der Einleitung, aber taugt leider gar nicht um dann sinnvoll zu helfen. Sinnvoll wären Infos wie:
- Was ist dein aktuelles Problem?
- wie bist du dahin gekommen?
- Was sollte deiner Meinung nach passieren?
- Was passiert stattdessen?
- Was meinst du genau mit "ansprechen"?

Aber ich kann dir versichern: Es geht. Ich habe es soeben ausprobiert:
ee-mvc


georgeboy - Di 17.11.20 09:00

Ich habe mit VS 2019 Community ein ASP.NET Projekt mit MVC C# angelegt, auf der View eine TextBox mit einer id="MeineTextBox" angelegt, und wollte im Controller in die TextBox schreiben: MeineTextBox.Text = "MeinText"; Der Compiler kannte allerdings den Namen: "MeineTextBox" nicht. Müsste man da einen Namespace einbinden ?


jfheins - Di 17.11.20 15:23

Ok, damit kann man schon mehr anfangen :-)

Du brauchst eine Klasse, die als Model fungiert (das M in MVC).
Könnte z.B. so aussehen:

C#-Quelltext
1:
2:
3:
4:
public class MyModel {
    public string Text { get; set; }
    public MyModel(string val) => Text = val;
}


Dann schreibst du im Controller:

C#-Quelltext
1:
return View(new MyModel("MeinText"));                    


Und in der View kannst du in der ersten Zeile ein @model MyModel einfügen und im HTML den Wert mit @Model.Text anzeigen.

Wenn du mit asp.net core unterwegs bist, wäre das hier auch ein guter Einstieg: https://docs.microsoft.com/de-de/aspnet/core/tutorials/first-mvc-app/start-mvc?view=aspnetcore-5.0&tabs=visual-studio


georgeboy - Di 17.11.20 17:08

Wo kommt in deinem Beispiel die TextBox bzw deren Inhalt ins Spiel, also lesender Zugriff auf die TextBox ? Als Client muss ich ja eine Eingabe machen können, die weiterverarbeitet werden kann. Kann sein dass ich das ganze noch nicht verstehe, bin hier noch Anfänger ...


jfheins - Di 17.11.20 17:25

Ja, du kannst Eingaben machen.

Sobald das Formular abgesendet wird, bekommst du den Wert. Das Formular benötigt einen Endpunkt (kann der gleiche sein) und darin kannst du einen Parameter anlegen, der genau so heißt wie die Textbox.


georgeboy - Di 17.11.20 17:38

Tut mir leid, dass ich lästig bin, nun habe ich keine Ahnung was ein "Endpunkt" ist ( arbeite nicht mit Core ), könntest Du mir ganz grob eine Lösung für mein, im ersten Beitrag, aufgeführtes Beispiel geben. Also beim Server eine Datei mit Strings, beim Client eine Textbox und ein Button, beim draufclicken eine Meldung, ob die Eingabe in der Datei enthalten ist, nur wenns nicht zuviel ist ...


jfheins - Mi 18.11.20 20:53

Sowas sollte eigentlich nach jedem guten Tutorial keine Hürde darstellen, aber ich habe es auch mal kurz selber gebastelt.

Wesentliche Teile (in der Reihenfolge MVC):
Model:

C#-Quelltext
1:
2:
3:
4:
5:
    public class MyModel
    {
        public int StringIndex { get; set; }
        public bool IndexValid => StringIndex >= 0;
    }

View:

HTML-Dokument
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
@model Web_Demo.Controllers.MyModel
@{
    ViewBag.Title = "Home Page";
}

<div class="jumbotron">
    <h1>ASP.NET</h1>
    <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
    <p><a href="https://asp.net" class="btn btn-primary btn-lg">Learn more »</a></p>
</div>

<div class="row">
    <div class="col-md-4">

        @using (Html.BeginForm("Index""Home", FormMethod.Get))
        {
            <input type="text" name="demotextbox" autocomplete="off" />
        }

        @if (Model.IndexValid)
        {
            <p>String gefunden an Index @Model.StringIndex :-)</p>
        }
        else
        {
            <p>String nicht gefunden</p>
        }
    </div>
</div>

Controller:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public class HomeController : Controller
{
    private static List<string> ExampleStrings = new List<string>
    {
        "Test""Hallo""Welt""Entwickler""Ecke"
    };


    [HttpGet]
    public ActionResult Index(string demotextbox = null)
    {
        var listIdx = ExampleStrings.IndexOf(demotextbox);

        return View(new MyModel { StringIndex = listIdx });
    }
}


Das einlesen aus einer Datei habe ich mir mal gespart und eine Liste in der Klasse erstellt. Aber das geht ja mit File.ReadAllLines() einfach ;-)


georgeboy - Do 19.11.20 08:28

Also wirklich, vielen Dank für deine Mühe, ganz toll, ich werde dein Beispiel heute noch testen, bis dann ...


georgeboy - Do 19.11.20 10:33

Doch noch ein Problem: bei "return View(new MyModel { StringIndex = listIdx } );"
kommt folgende Fehlermeldung:

Fehler
1:
2:
Fehler  CS0246  Der Typ- oder Namespacename "MyModel" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis).
    NeuerTest1  C:\Projekte\Web\NeuerTest1\Controllers\HomeController.cs  20  Aktiv


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Code-Tags hinzugefügt


Th69 - Do 19.11.20 10:37

Das gehört nun wirklich zu den Grundlagen von C#.
Und für Compilerfehler gibt es die Doku dazu: CS0246 [https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/compiler-messages/cs0246].


georgeboy - Do 19.11.20 10:49

Das scheint mir kein C# Problem zu sein, sondern von ASP:NET MVC, da muss man nirgends ein Model, eine View, in den Controller explizit einbinden ...


georgeboy - Do 19.11.20 10:54

Das Projekt das ich eröffnet habe, ist ein VS 2019 Community ASP.NET MVC, kein Core Projekt, aber das dürfte hier nicht das Problem sein, nur zur Information ...


georgeboy - Do 19.11.20 11:08

So jetzt gehts doch, es muss heissen: "return View(new Models.MyModel { StringIndex = listIdx } );"
Jetzt habe ich lange gesucht, und Du hast mir geholfen, und dann auch noch so ausführlich, gibts nicht immer ! Danke !!!

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Do 19.11.20 11:35

Klar war das jetzt ein Problem mit dem Namensbereich (namespace), also ein C#-Problem. ;-)

PS: Ein "using Models" hätte es auch gelöst...


georgeboy - Do 19.11.20 15:32

Th69 hast recht, der namespace "Models" wird offensichtlich von der IDE angelegt ...


georgeboy - Di 24.11.20 16:29

Leider nerve ich wieder, habe bei deinem Beispiel folgendes hinzugefügt:

HTML-Dokument
1:
2:
3:
<div>
     <img src="~/App_Data/MeinBild14.png"  alt=""/>
</div>

wird leider nicht angezeigt, nur ein kleines undefinierbares Fenster. Die Bilddatei "MeinBild14.png" habe ich schon an verschiedener Stelle eingefügt, ohne Erfolg ...

Moderiert von user profile iconTh69: HTML-Tags hinzugefügt


georgeboy - Mi 25.11.20 10:15

So gings doch:


HTML-Dokument
1:
2:
3:
<div>
   <img src="/Content/MeinBild14.png"  alt=""/>
</div>