-2

Ich habe eine erstellt, in der CRUD Operationen ausgeführt werden. Jetzt wollte ich es auf Echtzeitbasis testen, also entschied ich mich, eine Konsolenanwendung zu erstellen, indem ich dem Tutorial this folgte. Das Tutorial stellt den Code zur Verfügung, in dem der Code beim Ausführen der Anwendung selbst ein Produkt erstellt und es erhält, aktualisiert und löscht. Aber ich möchte Benutzereingaben verwenden. Ich bin erfolgreich bei der Erstellung von Produkten. Aber während es immer ich ein Problem konfrontiert bin, sehen mein CodeDie GET-Methode in der Konsolenanwendung kann nicht verwendet werden

Klasse

class Product 
{   

    [Key] 
    public string Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    public decimal Price { get; set; } 

    [Required] 
    public string Category { get; set; } 
} 

Console

static HttpClient client = new HttpClient(); 



    static void ShowProduct(Product product) 
    { 
     Console.WriteLine($"Name: {product.Name}\tPrice: {product.Price}\tCategory: {product.Category}"); 
    } 

    static async Task<Uri> CreateProductAsync(Product product) 
    { 
     HttpResponseMessage response = await client.PostAsJsonAsync("api/product/", product); 
     response.EnsureSuccessStatusCode(); 

     // return URI of the created resource. 
     return response.Headers.Location; 
    } 

    static async Task<Product> GetProductAsync(string path) 
    { 
     Product product = null; 
     HttpResponseMessage response = await client.GetAsync(path); 
     if (response.IsSuccessStatusCode) 
     { 
      product = await response.Content.ReadAsAsync<Product>(); 
     } 
     return product; 
    } 

static async Task RunAsync() 
    { 
     int a; 
     decimal price = 0; 
     string name = null, category = null; 
     char option; 

     client.BaseAddress = new Uri("http://localhost:7361/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     try 
     { 
      label: 
      Console.Write("1. Create a product\n"); 
      Console.Write("2. View products\n"); 
      Console.Write("3. Update a product\n"); 
      Console.Write("4. Delete a product\n"); 
      Console.Write("5. Exit\n"); 

      Console.WriteLine("\nEnter your choice: "); 
      a = Convert.ToInt32(Console.ReadLine()); 


      switch(a) 
      { 
       case 1: 

        Console.WriteLine("Enter name of the product: "); 
        name = Convert.ToString(Console.ReadLine()); 

        Console.WriteLine("\nEnter price of the product: "); 
        price = Convert.ToDecimal(Console.ReadLine()); 
        Console.WriteLine("\nEnter category of the product: "); 
        category = Convert.ToString(Console.ReadLine()); 

        // Create a new product 
        Product product = new Product { Name = name, Price = price, Category = category }; 

        var url = await CreateProductAsync(product); 
        Console.WriteLine($"Created at {url}"); 

        Console.WriteLine("Want to create more product(s)? (y/n): "); 
        option = Convert.ToChar(Console.ReadLine()); 

        if(option == 'y' || option == 'Y') 
        { 
         Console.Clear(); 
         goto case 1; 
        } 
        else if(option == 'n' || option == 'N') 
        { 
         Console.Clear(); 
         goto label; 
        } 

        break; 

       case 2: 

        // Get the product 

        product = await GetProductAsync(url.PathAndQuery); 
        ShowProduct(product); 

        break; 

        //case 3:... 
        //case 4:... 

       case 5: 

        Environment.Exit(0); 

        break; 
      } 
} 

In case 2 bei product = await GetProductAsync(url.PathAndQuery);, vermag ich nicht url Variable zu verwenden, wie es sagt Use of unassigned local variable 'url'.

Auch ich kann nicht var außerhalb es erklären, weil es für niemanden initialisiert wird.

Ich habe versucht, den Typ von var zu string zu ändern, aber immer noch nicht in der Lage, die Aufgabe zu erfüllen.

Jede Hilfe sehr geschätzt würde

+0

Was würden Sie erwarten, wenn Sie Ihre Konsolenanwendung starten und sofort Option 2 wählen? Woher sollte es das Produkt bekommen? –

+1

Sie haben ein einfaches Problem mit dem Geltungsbereich, das nichts mit dem Erstellen von Webanforderungen zu tun hat. Ihr Code wäre sauberer und einfacher zu verstehen, wenn es sich um eine While-Schleife anstelle von Schaltern mit 'Goto's handelt. – Crowcoder

+0

@KirkLarkin wenn ich Option 2 dann nichts passiert passiert und nach dem Drücken der Enter-Taste die Anwendung beendet – faisal1208

Antwort

1

Ihre Tipps auf Teilen wie den Compiler bestechen Verwendung nicht zugewiesene Variable zu ermöglichen;)

Sie versuchen Variable url innerhalb case 2: obwohl, dass variable doesn zu verwenden 't existieren im Rahmen dieses Falles. Es scheint, Sie url innerhalb case 1: und technisch diese Variable deklariert haben, können nicht 1.

Gehen Sie einen Schritt zurück und haben einen schnellen Lesezugriff über die break Aussage Schluss Fall auf variable scope within switch statement in c#

Eine schnelle Lösung ist delcare Uri url kurz vor der switch(), so ist es in allen Fällen im Schalter zugänglich. Stellen Sie sicher, dass Sie entweder einen Initialwert angeben oder eine default:-Anweisung hinzufügen und initialisieren, bevor Sie sie weiter unten im Code verwenden.

+0

Ich habe 'Uri URL' außerhalb des Schalters erklärt. Und nach dem Ausführen der Anwendung, wenn ich "Option 2" auswähle bekomme ich diesen Fehler 'No MediaTypeFormatter ist verfügbar, um ein Objekt vom Typ 'Produkt' aus Inhalt mit Medientyp 'Text/HTML' zu lesen.3 ' – faisal1208

+0

Es funktioniert, ich tat etwas stimmt nicht. – faisal1208

Verwandte Themen