17

Sono nuovo al core MVC.Asp.net core Parametro MVC post sempre null

Ho creato un progetto con nucleo MVC che ha un controller. Questo controller ha metodi di azione Get e Post. Se passo i dati per ottenere il metodo usando la stringa di query funziona bene, ma quando passo JSON complesso per postare il metodo, allora mi mostra sempre null.

Ecco quello che sto facendo:

Inserisci richiesta

URL: http://localhost:1001/api/users 
Content-Type: application/json 
Body: 
{ 
    "Name":"UserName", 
    "Gender":"Gender of the user", 
    "PhoneNumber":"PhoneNumber of the user" 
} 

Ecco il metodo azione Posta

[HttpPost] 
[Route("api/users")] 
public async Task<IActionResult> Post([FromBody]User newUser) 
{ 
    ... 
} 

Quando la richiesta post è chiamato, quindi newUser mi mostra sempre null E se rimuovo l'attributo [FromBody] allora ricevo l'oggetto NewUser ma tutti i suoi campi sono nulli.

Per favore aiutami e guidami in questo numero.

CURA

Ecco il mio utente classe

public class User{ 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Gender { get; set; } 
    public string PhoneNumber { get; set; } 
} 

avevo fatto uguale a quello descritto here per i dati JSON, ma riceve ancora nulla.

+0

Avete qualche middleware che potrebbe intercettare la richiesta? hai fatto una traccia di cavi o di violinista? – Toxicable

+1

No, sto inviando richiesta utilizzando il postino. Non so come tracciare la richiesta usando il violinista. –

+0

Scarica il violinista, e guarda le richieste e ispezionale, assicurati che ciò che stai inviando corrisponde alla richiesta effettiva. Non è davvero complicato usare – Toxicable

risposta

13

Questo potrebbe essere a causa di come i valori nulli vengono gestiti. Impostare NullValueHandling su Ignora in AddJsonOptions e vedere se funziona.

public void ConfigureServices(IServiceCollection services) 
{ 
    services 
     .AddMvc() 
     .AddJsonOptions(jsonOptions=> 
     { 
      jsonOptions.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
     }); 
} 
+0

Grazie amico, ha funzionato bene. Ora so perché i dati ricevuti sono nulli. –

+1

GRAZIE ... Non penso che l'avrei capito subito senza il tuo aiuto. – m4design

-6

La classe utente deve avere un costruttore senza parametri di default per questo lavoro ...

+0

Non ha un costruttore implicito senza parametri se non si specifica alcun costrutto? –

+0

No, non è così. È necessario definire esplicitamente un costruttore senza parametri poiché il sistema di associazione modello deve creare un'istanza dell'oggetto per popolare le sue proprietà pubbliche. – Issac

+4

Credo che vi sbagliate riguardo alla necessità di un costruttore senza parametri esplicitamente definito quando non ci sono altri costruttori definiti. Se non si hanno affatto costruttori definiti, il compilatore ne genera uno. Vedere https://msdn.microsoft.com/en-us/library/ms173115.aspx, quarto paragrafo. È vero, tuttavia, che se sono già stati definiti altri costruttori, sarà necessario definire un costruttore esplicito senza parametri se si desidera averne uno. –

0

Sei su Microsoft.AspNetCore.Mvc 1.0.0?

Se siete, tenta l'invio di questo oggetto come il vostro corpo in una richiesta (cammello proprietà con carter):

{ 
    "name":"UserName", 
    "gender":"Gender of the user", 
    "phoneNumber":"PhoneNumber of the user" 
} 
+0

Sì, sto usando Microsoft.AspNetCore.Mvc 1.0.0 Inoltre sto inviando dati nel corpo della richiesta –

+0

Sì, ma, utilizzare i nomi delle proprietà cased cammello nel JSON. – steamrolla

+0

È l'impostazione predefinita in 'Microsoft.AspNetCore.Mvc 1.0.0'. – steamrolla

2

Ho creato nuovo progetto ASP.NET core, ha aggiunto la funzionalità, e funziona. Per favore, controlla this project su github.

Inoltre, vedi screenshot di log con semplice comunicazione con questo controller dalla console del browser: Console output

10

Annotare il metodo originale Post([FromBody] User newUser)

Per i futuri lettori di google, questo stesso problema potrebbe sorgere se il metodo fosse Post(User newUser)

Annotare il mancanza di [FromBody]. Questo è un allontanamento dalle precedenti versioni di MVC in cui questi parametri erano generalmente dedotti.

Se sei un esistente MVC5 sviluppatore che trova questa pagina per quanto riguarda AspNetCore.MVC, assicurati di controllare due volte che avete [FromBody] decorate, se del caso.