Laden...

ASP.NET MVC 3 , Daten von View an Controller übergeben

Erstellt von Shaft vor 12 Jahren Letzter Beitrag vor 10 Jahren 7.765 Views
S
Shaft Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren
ASP.NET MVC 3 , Daten von View an Controller übergeben

Hallo zusammen,
ich kriege es einfach nicht hin, Daten von einer View an einen entsprechenden Controller zu übergeben. Ich erstelle in einer View eine Liste von Objekten, und möchte das ausgewählte objekt der Liste per ActionLink an einen Controller übergeben.

Das Model sieht folgendermaßen aus:


namespace Test.Models
{
    public class Pupil
    {
        public int Id { get; set; }
        public string Firstname { get; set;}
        public string Lastname {get;set;}

       ....weitere Properties
    }
}

Dann habe ich noch eine Klasse die eine Liste von Pupil und diverse Methoden erhält,
sowie die Liste mit Daten aus einer DB initialisiert


namespace Test.Models
{
  public class PupilContext
  {
     public List<Pupil> AllPupils {get; set;}
     public int SearchId;

      ....weiter Properties und Methoden
   } 

Im HomeController habe ich 2 ActionResults. Home zeigt eine Liste aller Schüler (IndexView)



//Index Methode des Home Controllers
public ActionResult Index()
{
   var model = new  PupilContext();
   model.AllPupils = //Liste initialistieren


            return View(model);
 }


//Index View

@model Test.Models.PupilContext 

//Liste generieren
<ul>
@foreach(var pupil in PupilContext)
{

//Hier möchte ich die ID eines Pupil Objektes an den ActionLink übergeben, der
//die About Methode des HomeControllers aufruft
 
 <li>@Html.ActionLink(pupil.Name,"About","Home",?id des Objektes?)</li>
 } 
</ul>

//About Methode des Home Controllers....searchId ist bei mir immer leer
public ActionResult About(int searchId)
{

       ....do something

            return View();
 }

...habe mittlerweile eineige Tutorials durchgesehen..bin bisher allerdings auf nichts gestoßen was mir weiterhilft oder habe es evtl. nicht richtig verstanden. Ich hoffe das mein Gesamtansatz korrekt ist, da ich im bereich MVC noch ein Anfänger bin..

16.834 Beiträge seit 2008
vor 12 Jahren

Hi,

kleiner struktureller Tipp:
Du solltest Für jede Action, die ein Form empfängt, zwei Models haben. (In Deinem Fall reicht eine, weil es ja nur eine Weiterleitung ist).

Zum einen hast Du ein ViewModel, mit dem Du die Seite generierst. Sprich das ViewModel hat eine Collection, die vom Controller gefüllt und mittels einer SelectBox in der View angezeigt werden. Oder eben Textboxen mit Standardwerten.

Anschließend hast Du in der empfangenden Action ein "SubmitModel", das genau die Properties enthält, die Du von der Form erwartest.
Statt dem SubmitModel könnte man auch direkt eine DatabaseEntity, zB ein Benutzer (oder bei Dir Pupils)verwenden,; es fördert aber ein wenig die Übersicht, wenn man hier mit Hilfsklassen arbeitet - auch wenn das ein Zwischenschritt mehr ist.

Aussehen könnte das ganz dann so:

public class MyController : Controller
{
	public ActionResult Neu()
	{
		var viewModel = new NeuViewModel();
		
		return View("Neu", viewModel);
	}
	
	[HttpPost]
	public ActionResult Neu(NeuSubmitModel submitModel)
	{
		var viewModel = new NeuViewModel();
		viewModel.SubmitModel = submitModel;
		
		// Hier prüfen, ob das SubmitModel gültig ist
		
		return View("Neu", viewModel);
	}
}

public class NeuViewModel
{
	public NeuSubmitModel {get;set;}
}

public class NeuSubmitModel
{
	public String Vorname {get;set;}
	public String Nachname {get;set;}
}

Soviel mal zum genrellen Teil.

Nun mal zu Deinem Teil.
Prinzipiell ist die Benamsung geschmackssache; aber Du könntest - gerade wenn alles noch nicht so 100%tig sitzt - mit Deiner Benennung etwas durcheinander kommen. Daher solltest Du Dir vielleicht überlegen, ob Du Dien PupilContext nicht lieber in PupilAllViewModel umbennenen willst.

Ein Context wird meist mit einer Datenbank in Verbindung gebracht; und ein ViewModel eine Darstellungshilfe für die View.

Zudem sollte ein ViewModel keine Methoden haben, sondern relativ doof sein.


Nun zum falschen Link: Der ASP ActionLink ist sehr sehr unperformant; daher sollte man den aus meinen Augen eher nicht verwenden.
Benutze hier lieber wirklich Plain-HTML:


<a href="@Url.Action("About", new RouteValueDictionary{{"searchId", pupil.Id}})">@(pupil.Name)</a>

Es würde nun ein Link generiert werden mit /About?searchId=5.
Wenn Du nun einen Link haben willst wie zB /Pupils/5 dann musst Du in der RouteTable eine eigene, benannte Route definieren.

S
Shaft Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren

super..so kriege ich schon mal meine Werte übergeben.
Ja mit den ViewModels muss ich mich noch ein wenig beschäftigen..aber irgendwie geht keines der Standardtutorials darauf ein, aber das ist ein anderes Thema...
besten Dank für die prompte Hilfe,
Shaft

16.834 Beiträge seit 2008
vor 12 Jahren

Die meisten geben die Collection oder das Objekt direkt mit. Ist aber nicht praktikabel in einer großeren Anwendung; oder eben wenn mehr passiert als nur ein Edit eines Models.
Daher nimmt man ViewModels - nicht nur bei ASP.

Z
322 Beiträge seit 2006
vor 10 Jahren

@Abt

Bzgl. deinem ersten Post bin ich noch etwas am Zweifeln. Die Trennung von View und Submit Model halte ich ebenfalls in der Theorie für mehr als sinnvoll. Leider praktisch noch einige Lücken? bspw. die HttpGet-Methode (Neu()) liefert mir ein Neu.cshtml samt Input Felder, aber da das SubmitModel nun mit einem Prefix gerendert wird bekomme ich in der Post Methode nicht das gewünschte Submit Objekt serialsiert. Abhilfe würde ein PartialView schaffen..., aber packe ich jetzt den gesamten HTML Markup von Neu.cshtml in NeuPartial.cshml und lasse mir alles mit

RenderPartial

anzeigen? Würdest du so vorgehen? Oder denke ich falsch? Danke

16.834 Beiträge seit 2008
vor 10 Jahren

Ich kann Dir nich folgen.