Routen mit verschiedenen Controllern, aber gleiche Aktion Namen nicht produzieren wollte-urls
Bin ich, die versuchen, eine API für mein MVC-web-app, die eine Menge Strecken, aber vieles von dem gleichen Teil für jeden. Im Grunde eine CRUD-für jeden Bereich. Ich bin auch der Einstellung, die es bis zu der version-ist in der Lage. Ich habe zwei Controller, jeder mit einer einfachen Aktion zu starten und erhalten ein Konflikt rechts von der Fledermaus. Der Fehler den ich bekomme, ist
Ich bin nach diesen urls
- https://foo.bar/aim/v1/contacts/delete/11111
- https://foo.bar/aim/v1/locations/delete/11111
- und so weiter
MVC wird lassen Sie haben eine
- https://foo.bar/home/index/
- https://foo.bar/contacts/index/
- und so weiter
So, ich bin auf der Suche nach einem Weg um unnötig Benennung Dinge wie contacts_delete
und locations_delete
Herstellung von URLs wie
- https://foo.bar/aim/v1/contacts/contacts_delete/11111
- https://foo.bar/aim/v1/locations/locations_delete/11111
-
und so weiter
(das ist in der Beobachtung der root-Problem in die Kommentare und unter anwsers wie
Route names must be unique. You cannot have two different routes named delete. Use deleteLocation and deleteContact instead.
)
Kann ich da auch nur tun https://foo.bar/aim/v1/contacts_delete/11111
aber das scheint so sinnlos für mich. Wenn die MVC kann es tun, ich habe zu glauben, dass es ist ein Weg, um dies geschehen zu lassen.
Der Fehler den ich bekomme, ist:
Attribut Routen mit dem gleichen Namen 'löschen' müssen die gleiche Vorlage:
Aktion: "rest.fais.foo.edu.Controller.aimContactsController.löschen (rest.fais.foo.edu)' - Vorlage: 'Ziel/v1/Kontakte/delete/{id}'
Aktion: "rest.fais.foo.edu.Controller.aimLocationsController.löschen (rest.fais.foo.edu)' - Vorlage: 'Ziel/v1/Standorte/delete/{id}'
Für die Controller habe ich
[EnableCors("SubDomains")]
[ResponseCache(NoStore = true, Duration = 0)]
[Produces("application/json")]
[Route("aim/v1/contacts/[action]")]
[ProducesResponseType(typeof(errorJson), 500)]
public class aimContactsController : Controller
{
private readonly IHostingEnvironment _appEnvironment;
private readonly AimDbContext _aim_context;
private readonly UserManager<ApplicationUser> _userManager;
public aimContactsController(IHostingEnvironment appEnvironment,
AimDbContext aim_context,
UserManager<ApplicationUser> userManager)
{
_appEnvironment = appEnvironment;
_userManager = userManager;
_aim_context = aim_context;
}
[HttpPost("{id}", Name = "delete")]
public IActionResult delete(string id)
{
return Json(new
{
results = "deleted"
});
}
}
[EnableCors("SubDomains")]
[ResponseCache(NoStore = true, Duration = 0)]
[Produces("application/json")]
[Route("aim/v1/locations/[action]")]
[ProducesResponseType(typeof(errorJson), 500)]
public class aimLocationsController : Controller
{
private readonly IHostingEnvironment _appEnvironment;
private readonly AimDbContext _aim_context;
private readonly UserManager<ApplicationUser> _userManager;
public aimLocationsController(IHostingEnvironment appEnvironment,
AimDbContext aim_context,
UserManager<ApplicationUser> userManager)
{
_appEnvironment = appEnvironment;
_userManager = userManager;
_aim_context = aim_context;
}
[HttpPost("{id}", Name = "delete")]
public IActionResult delete(string id)
{
return Json(new
{
results = "deleted"
});
}
}
Für die Start.cs ich habe
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
//RolesData.SeedRoles(app.ApplicationServices).Wait();
app.UseApplicationInsightsRequestTelemetry();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
app.UseBrowserLink();
}
else
{
//app.UseExceptionHandler("/Home/Error");
}
app.UseIdentity();
app.UseDefaultFiles();
app.UseStaticFiles();
//app.UseResponseCompression();
//Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715
app.UseSession();
//custom Authentication Middleware
app.UseWhen(x => (x.Request.Path.StartsWithSegments("/aim_write", StringComparison.OrdinalIgnoreCase) || x.Request.Path.StartsWithSegments("/rms", StringComparison.OrdinalIgnoreCase)),
builder =>
{
builder.UseMiddleware<AuthenticationMiddleware>();
});
//Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
//Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
c.RoutePrefix = "docs";
//c.SwaggerEndpoint("/docs/v1/wsu_restful.json", "v1.0.0");swagger
c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1.0.0");
});
app.UseMvc(routes =>
{
routes.MapRoute(
name: "javascript",
template: "javascript/{action}.js",
defaults: new { controller = "mainline" });
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "AIMApi",
template: "aim/v1/{action}/{id?}",
defaults: new { controller = "aim" });
routes.MapRoute(
name: "AIMContactsApi",
template: "aim/v1/contacts/{action}/{id?}",
defaults: new { controller = "aimContactsController" }
);
routes.MapRoute(
name: "AIMLocationsApi",
template: "aim/v1/locations/{action}/{id?}",
defaults: new { controller = "aimLocationsController" }
);
routes.MapRoute(
name: "RMSApi",
template: "{controller=rms}/v1/{action}/{id?}");
});
}
}
Was ich kann nicht scheinen, um google die Antwort, wie dies zu umgehen. Ich will lösen das unmittelbare Problem, aber alle vermuten, sind willkommen.
- Route-Namen müssen eindeutig sein. Sie können nicht zwei verschiedene Routen, die mit Namen
delete
. VerwendendeleteLocation
unddeleteContact
statt. - oh, es muss einen anderen Weg geben, dann keine Möglichkeit? Ich meine, was ist der Punkt zu definieren, die controller, das tun die route Vorlage oder etwas in der lol. Benutzerdefinierte middelwear vielleicht? Wirkt einfach wie ein grosser Fehler einen router haben, können nicht sagen, der Unterschied zwischen einer Handlung, die auf einem controller und einem anderen. Auf dass, die können Sie haben ein
Index
auf all die verschiedenen MVC-Controller? - Bitte, nicht mit Gewalt-tags in den Fragen, es wird nicht Ihre Frage schneller beantwortet werden
- Im Grunde kann ich nicht verstehen, warum Sie den Attribut-routing, wenn Sie die exakt gleichen Routen auf Ihrem Start.cs ? Auch auf Ihrem Start.cs die AIMApi route muss nach dem AIMLocationsApi
- es ist wegen es funktioniert nicht "richtig"/wie erwartet es.
- merkte, es war nicht bösartig
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beide Routen sind den gleichen Namen, das kann nicht funktionieren in ASP.NET Kern MVC.
Ich spreche nicht über die Methoden der Namensgebung, sondern um Routen zu benennen. Sie rief beide Ihre Routen mit dem gleichen Bezeichner
Name = "delete"
innerhalb derHttpPost
Attribut. Route names in MVC eindeutig identifiziert eine route Vorlage.Von dem, was ich sehen kann, die Sie nicht wirklich brauchen, zu identifizieren, Ihre Routen, aber nur zur Unterscheidung von verschiedenen URIs. Aus diesem Grund können Sie frei entfernen Sie die
Name
Eigenschaft vonHttpPost
- Attribut auf den Aktion Methoden. Dies sollte genug für ASP.NET Core-router passend zu Ihrem action-Methoden.Wenn Sie, statt, was zu wiederherstellen mit nur Attribut-routing Sie besser ändern Sie Ihre controller auf die folgenden:
Name
Eigenschaft vollständig zusammen mit der[action]
token vom ControllerRoute
Attribut, und geben Sie den relativen url innerhalb derHttpPost
- Attribut? So etwas wie dieses:[HttpPost("delete/{id}")]
name=""
Attribut kümmern, ein Teil der Antwort, der andere war als @NickPolideropoulos angegeben, dass die Bestellung war auch Weg, und dasAIMApi
route muss gehen nach derAIMLocationsApi
. Wenn Sie Bearbeiten Ihre Antwort, dass ich denke, wir haben hier eine Lösung. Vielen Dank für die Hilfe.Andere mögliche Lösung ist: