2017-06-02 1 views
4

Wenn ich UrlHelper.Link innerhalb eines API-Aufrufs aufrufen, der einen Parameter hat, der einem optionalen Parameter des API-Endpunkts entspricht, für den ich versuche, eine URL zu erhalten, gibt UrlHelper.Link eine URL mit Werten aus die aktuelle Anfrage, egal wie ich den optionalen Parameter aus dem Link ausschließe.UrlHelper.Link gibt unerwünschte Parameter zurück

z.B.

[HttpGet] 
[Route("api/Test/Stuff/{id}")] 
public async Task<IHttpActionResult> GetStuff(int id) // id = 78 
{ 
    string link = Url.Link("Mary", new 
    { 
     first = "Hello", 
     second = "World" 
    }); 

    string link2 = Url.Link("Mary", new 
    { 
     first = "Hello", 
     second = "World", 
     id = (int?)null 
    }); 

    string link3 = Url.Link("Mary", new 
    { 
     first = "Hello", 
     second = "World", 
     id = "" 
    }); 

    return Ok(new 
    { 
     link, 
     link2, 
     link3 
    }); 
} 

[HttpGet] 
[Route("api/Test/Another/{first}", Name = "Mary")] 
public async Task<IHttpActionResult> AnotherMethod(
[FromUri]string first, 
[FromUri]string second = null, 
[FromUri]int? id = null) 
{ 
    // Stuff 
    return Ok(); 
} 

GET http://localhost:53172/api/Test/Stuff/8

kehrt

{ 
    "link": "http://localhost:53172/api/Test/Another/Hello?second=World", 
    "link2": "http://localhost:53172/api/Test/Another/Hello?second=World&id=8", 
    "link3": "http://localhost:53172/api/Test/Another/Hello?second=World&id=8" 
} 

Wie bekommt man Url.Link, um tatsächlich die Werte verwenden Sie es passieren, anstatt es aus dem aktuellen api Anfrage zu ziehen, wenn sie nicht dargestellt werden oder einer Null oder einer leeren Zeichenfolge zugewiesen?

Ich glaube, die Frage ist sehr ähnlich zu ....

UrlHelper.Action includes undesired additional parameters

Aber das ist Web-API nicht MVC, keine Aktion und die Antworten zur Verfügung gestellt scheinen keine offensichtliche Lösung dieses Problems zu erhalten Problem.

EDIT: Ich habe den Code aktualisiert, da der ursprüngliche Code das Problem tatsächlich nicht repliziert hat. Ich habe auch eine Anfrage-URL hinzugefügt und die Antwort zurückgegeben, die ich getestet habe. Während dieser Code das Problem veranschaulicht, übergibt der Code, für den ich eine Fehlerbehebung suche, keinen anonymen Typ an UrlHelper, sondern eine Klasse, die einen Zeitstempel und einen Hash generiert und vier optionale Parameter besitzt. Wenn es eine andere Lösung gibt, die nicht die optionalen Parameter in der Struktur auslassen muss, die an UrlHelper übergeben wird, würde ich es gerne haben, da es mich davor bewahren würde, viele Änderungen am Code vorzunehmen.

+0

Zeigen Sie auch die ursprüngliche URL und die generierte URL an. – Nkosi

+0

Ich würde vorschlagen, die Antwort ist eher eine Arbeit um.Es ist etwas, von dem ich denke, dass es eine Menge Leute erwischen wird, die irrtümlich glauben, dass das Zuweisen eines leeren oder Null-Werts an eine beliebige Struktur (einschließlich anonymer oder Klassentyp), die an UrlHelper übergeben wird, dasselbe wäre wie das Weglassen des Wertes. Während das Verhalten tatsächlich von Entwurf sein könnte, denke ich, es ist sehr schlecht konzipiert und nicht das, was Sie erwarten würden – Mick

Antwort

3

Nicht enthalten die id beim Übergeben der Routenwerte. In der Tat soll es nicht zulassen, dass Ihnen als

kompilieren nicht <null> anonyme Eigenschaft type

public async Task<IHttpActionResult> GetStuff(int id) // id = 78 { 
    string myUrl = Url.Link(
     "Mary", 
     new 
     { 
      first = "Hello World" 
     }); 

    //...other code 
} 

Getestet mit web api 2 und id zuweisen kann nicht enthalten war, wenn auf andere Aktion zu verknüpfen.

[RoutePrefix("api/urlhelper")] 
public class UrlHeplerController : ApiController { 

    [HttpGet] 
    [Route("")] 
    public IHttpActionResult GetStuff(int id) { 
     string myUrl = Url.Link(
      "Mary", 
      new { 
       first = "Hello World", 
      }); 
     return Ok(myUrl); 
    } 

    [HttpGet] 
    [Route(Name = "Mary")] 
    public IHttpActionResult AnotherMethod(
    [FromUri]string first, 
    [FromUri]string second = null, 
    [FromUri]int? id = null) { 
     // Stuff 
     return Ok(); 
    } 
} 

Aufruf

client.GetAsync("/api/urlhelper?id=78") 

der Aktion GetStuff geleitet und der Link erzeugt

"http://localhost/api/urlhelper?first=Hello%20World" 

Selbst getestet, wenn sie mit

string myUrl = Url.Link(
    "Mary", 
    new { 
     first = "Hello World", 
     id = "" 
    }); 

id nicht in die aufgenommen wurde erzeugen d Verbindung.

+0

Ich habe die Frage aktualisiert. Technisch war das die Antwort auf meine Frage. Im Gegensatz zu dem Beispiel, das ich zur Verfügung gestellt habe, übergibt mein tatsächlicher Code jedoch keinen anonymen Typ an UrlHelper, sondern übergibt eine Klasse, die einen Zeitstempel und Hash erzeugt und vier optionale Parameter hat. Es scheint nach Ihrer Antwort zu gehen Ich müsste mehrere Versionen der Klasse erstellen, eine für jede mögliche Kombination erforderlich, die erforderlichen Eigenschaften für die Operation verfügbar machen. – Mick

+0

Ich glaube, mein ursprünglicher Code hat das Problem nicht repliziert. Ich denke, einschließlich der ID als Teil der URL in der Anfrage im Gegensatz zu einem Parameter ändert sich das Verhalten – Mick

+0

@Mick, Dann müssen Sie zeigen, zeigen Sie das tatsächliche Szenario. Das Anzeigen anonymer Typen ist irreführend, wenn dies nicht der Fall ist. – Nkosi

Verwandte Themen