2017-03-24 1 views
0

Ich verwende die Grid-Komponente von Kendo UI in meiner Web-API-Anwendung. Meine Datensätze werden korrekt geladen und sogar das Löschen funktioniert, aber leider funktionieren die Post und Update nicht. Ich habe die Fehlermeldung auf die Antwort der Anfrage: Nachricht: "Ein Fehler ist aufgetreten.", ExceptionMessage: "Wert kann nicht null sein. ↵Parametername: entity", ...}ASP Web API Der Kendo UI-Grid-Wert darf nicht null sein: entity

Balg Teil meiner Ansicht und Controller . Was vermisse ich? Versuche viele Dinge. * Die Feldnamen sind Kleinbuchstaben, weil ich CamelCase verwende.

$(document).ready(function() { 
    var dataSource = new kendo.data.DataSource({ 
     transport: { 
      read: { 
       url: "/api/products", 
       dataType: "json" 
      }, 
      update: { 
       url: function (data) { 
        return "/api/products/" + data.id; 
       }, 
       dataType: "json", 
       type: "PUT" 
      }, 
      destroy: { 
       url: function (data) { 
        return "/api/products/" + data.id; 
       }, 
       dataType: "json", 
       type: "DELETE" 
      }, 
      create: { 
       url: "/api/products", 
       dataType: "json", 
       type: "POST" 
      }, 
      parameterMap: function (options, operation) { 
       if (operation !== "read" && options.models) { 
        return { models: kendo.stringify(options.models) }; 
       } 
      } 
     }, 
     batch: false, 
     pageSize: 20, 
     schema: { 
      model: { 
       id: "id", 
       fields: { 
        id: { editable: false, nullable: true }, 
        name: { validation: { required: true } }, 
        description: { validation: { required: true } } 
       } 
      } 
     } 
    }); 

    $("#grid").kendoGrid({ 
     dataSource: dataSource, 
     pageable: true, 
     height: 550, 
     toolbar: ["create"], 
     columns: [ 
      { field: "name", title: "Name" }, 
      { field: "description", title: "Description" }, 
      { command: ["edit", "destroy"], title: " ", width: "250px" 
     }], 
     editable: "popup" 
    }); 

Und das ist ein Teil meiner Controller und Repository:

public IHttpActionResult GetProducts() 
{ 
    var products = _productRepository.GetProducts(); 
    return Ok(products); 
} 

[HttpPost] 
public IHttpActionResult CreateProduct(Product product) 
{ 
    _productRepository.CreateProduct(product); 
    _productRepository.SaveProduct(); 

    return Ok(); 
} 

[HttpPut] 
public IHttpActionResult UpdateProduct(int id, Product product) 
{ 
    var productInDb = _productRepository.GetProduct(id); 

    if (productInDb == null) 
     return NotFound(); 

    _productRepository.UpdateProduct(product); 
    _productRepository.SaveProduct(); 

    return Ok(); 
} 


public Product GetProduct(int id) 
{ 
    return _context.Products.SingleOrDefault(p => p.Id == id); 
} 

public void CreateProduct(Product product) 
{ 
    _context.Products.Add(product); 
} 

public void UpdateProduct(Product product) 
{ 
    _context.Entry(product).State = EntityState.Modified; 
} 

public void SaveProduct() 
{ 
    _context.SaveChanges(); 
} 

UPDATE denke ich parameterMap Funktion in erster Linie nicht in Ordnung war, weil, wenn die Veröffentlichung oder Aktualisierung es nie in dem Zustand eintritt , also hier wird die ParameterMap aktualisiert. Der POST funktionierte nach dieser Änderung (es schließt nicht nur das Fenster und repopuliert das Gitter, ich weiß nicht warum). Aber leider das Update funktioniert immer noch nicht, wie ich den folgenden Fehler innerhalb des Controllers erhalten "Anfügen einer Entität des Typs 'Models.Product' fehlgeschlagen, da eine andere Entität des gleichen Typs bereits den gleichen Primärschlüsselwert hat.". Was vermisse ich in dieser Situation?

parameterMap: function (options) { 
    return kendo.stringify(options); 
}, 
type: "json" 
+0

sehe ich nicht *** Update *** und *** zerstören *** in *** Verkehr ***. Außerdem sehe ich *** HttpPut *** und *** HttpDelete *** in Web API Controller nicht. Fehle ich etwas? – Win

+0

Tut mir leid, ich habe nur die create und httppost, aber ich habe sie in meinem Code. Ich dachte create und httppost war genug. Bei Bedarf bearbeite ich meine Frage mit dem Rest des Codes. – jtron

+0

Sie sagten *** Update *** funktioniert nicht, aber Sie zeigen uns *** Create *** Code. Bitte umformulieren Sie die Frage und aktualisieren Sie sie mit dem entsprechenden Code. – Win

Antwort

0

Ich schaffte es mit Hilfe in den Kommentaren zu lösen (im Grunde das Hauptproblem war die parameterMap und dann als Übergang zurück, um die Einheit in der Rückkehr der Controller-Methoden einer Füllung tweeks wurden ebenfalls erforderlich). Ich stelle den aktualisierten Code unten (nur der Teil, der geändert wurde).

Ausblick:

$(document).ready(function() { 
    var dataSource = new kendo.data.DataSource({ 
     transport: { 
      read: { 
       url: "/api/products", 
       dataType: "json" 
      }, 
      update: { 
       url: function (data) { 
        return "/api/products/" + data.id; 
       }, 
       dataType: "json", 
       type: "PUT" 
      }, 
      destroy: { 
       url: function (data) { 
        return "/api/products/" + data.id; 
       }, 
       dataType: "json", 
       type: "DELETE" 
      }, 
      create: { 
       url: "/api/products", 
       dataType: "json", 
       type: "POST" 
      }, 
      parameterMap: function (options) { 
       return kendo.stringify(options); 
      }, 
      type: "json" 
     }, 
     batch: false, 
     pageSize: 20, 
     schema: { 
      model: { 
       id: "id", 
       fields: { 
        id: { editable: false, nullable: true }, 
        name: { validation: { required: true } }, 
        description: { validation: { required: true } } 
       } 
      } 
     } 
    }); 

    $("#grid").kendoGrid({ 
     dataSource: dataSource, 
     pageable: true, 
     height: 550, 
     toolbar: ["create"], 
     columns: [ 
      { field: "name", title: "Name" }, 
      { field: "description", title: "Description" }, 
      { command: ["edit", "destroy"], title: " ", width: "250px" 
     }], 
     editable: "popup" 
    }); 

Controller:

public IHttpActionResult GetProducts() 
{ 
    var products = _productRepository.GetProducts(); 
    return Ok(products); 
} 

[HttpPost] 
public IHttpActionResult CreateProduct(Product product) 
{ 
    _productRepository.CreateProduct(product); 
    _productRepository.SaveProduct(); 

    return Ok(product); 
} 

[HttpPut] 
public IHttpActionResult UpdateProduct(int id, Product product) 
{ 
    _productRepository.UpdateProduct(product); 
    _productRepository.SaveProduct(); 

    return Ok(product); 
} 
Verwandte Themen