Wie kann man Parameter in einer Webadresse handhaben?
Wenn man zum Beispiel die Adresse http://meineDomain.de/Produkte/Smartphones/1000
Man kann jede MVC Action mit einem optionalen Parameter
versehen.
Beispiel Edit(int ID)
In dem MVC Controller ProductsController
Dadurch kann man http-Query Parameter übergeben wie
/Products/Edit/555 oder ?ID=555
public IActionResult Edit(int ID)
{
//*path: /edit/1
return Content("id=" + 1);
}
|
Dadurch kann man im Browser eingeben
/Products/Edit/1 oder ?ID=1
Unter Visual Studio im ProductsController
Router:
Damit der Parameter ID eingegeben werden kann wie /1234 ohne
namentliche Benennung wie ?ID=1234 muss in Startup.cs der Router eingestellt
werden.
Hier muss routes.MapRoute diese Variante als Muster
eingetragen haben.
Die Parameter von Controller Actions werden in der startup
definiert und sind meitens mit {id?} optional vorgegeben. Das heißt, mann kann
eine ID oder Nummer übergeben, muss aber nicht.
Wie hier in der Startup.cs:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
|
Optionale
Parameter in Action
Wie kann man einer Action Parameter übergeben, sodass
man im Browser in der URL Parameter als Query anfügen kann
Man kann jede Action mit zusätzlich optionalen
Parametern versehen.
Dabei müssen die Parameter Nullable sein, das heißt,
dass int mit int? definiert wird und
string Parameter können von sich aus null sein.
Der Standardparameter ist meistens ID, und dieser wird
im Router in der startup definiert in asp.net core
Beispiel http://localhost:61428/products/
public IActionResult Index(int? GroupID,string sortBy)
{
//* int? = nullable
if (GroupID.HasValue==false ) GroupID = 1;
if (string.IsNullOrWhiteSpace(sortBy)) sortBy = "Name";
return Content("GroupID=" + GroupID + " sortBy=" + sortBy );
}
|
Eingabe im
Browser ohne Parameter
http://localhost:61428/products/
Ergibt in der Action als Parameter
GroupID ist null und wird zu 1
sortBy ist leer und wird zu Name
Eingabe im
Browser mit einem Parameter
http://localhost:61428/products?GroupID=2
ergeben in der Action als Parameter:
GroupID=2 und sortBy ist leer und wird Name
Eingabe im
Browser mit beiden Parameter:
http://localhost:61428/products?GroupID=2&sortby=Price
als Parameter in der Action
GroupID=2 und sortBy="Price"
app.UseMvc(routes =>
{
//*name-template-default
routes.MapRoute(
"products_by_manufacturer_productgroup",
"products/manufacturer/{manufacturer}/{productgroup}",
new {controller="Products",action="byManufacturer_productgroup"}
);
});
|
Browsereingabe
http://localhost:61428/products/manufacturer/microsoft/tablets