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

MVC wird lassen Sie haben eine

So, ich bin auf der Suche nach einem Weg um unnötig Benennung Dinge wie contacts_delete und locations_delete Herstellung von URLs wie

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. Verwenden deleteLocation und deleteContact 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

InformationsquelleAutor jeremy.bass | 2017-07-24
Schreibe einen Kommentar