2015-10-18 16 views
6

Non sono sicuro di aver inquadrato correttamente la domanda in precedenza ma cercherò di spiegare al meglio la domanda che ho.Il modello mantiene la sua struttura quando i dati vengono ricevuti nel controller?

Ho seguito ContactUsModel che è una parte di HomeViewModel, meglio dire Nested Modello Classe in un unico model

public class ContactUsDataModel 
{ 
    public string ContactName { get; set; } 
    public string ContactEmail { get; set; } 
    public string ContactMessage { get; set; } 
    public string ContactPhone { get; set; } 
} 

e sto ottenendo questo Model cui in HomeViewModel come di seguito:

public class HomeViewModel 
{ 
    /*My other models goes here*/ 
    public ContactUsDataModel CUDModel { get; set; } 
} 

Ora nella vista Index.cshtml creo fortemente una vista modulo come di seguito:

@model ProjectName.Models.HomeViewModel 
<!--I have other views for other models--> 
@using (Html.BeginForm("ContactPost", "Home", FormMethod.Post, new { id = "contactform" })) 
{ 
    @Html.TextBoxFor(m => m.CUDModel.ContactName, new { @class="contact col-md-6 col-xs-12", placeholder="Your Name *" }) 
    @Html.TextBoxFor(m => m.CUDModel.ContactEmail, new { @class = "contact noMarr col-md-6 col-xs-12", placeholder = "E-mail address *" }) 
    @Html.TextBoxFor(m => m.CUDModel.ContactPhone, new { @class = "contact col-md-12 col-xs-12", placeholder = "Contact Number (optional)" }) 
    @Html.TextAreaFor(m=>m.CUDModel.ContactMessage, new { @class = "contact col-md-12 col-xs-12", placeholder = "Message *" }) 
    <input type="submit" id="submit" class="contact submit" value="Send message"> 
} 

faccio ajax Post come di seguito:

$('#contactform').on('submit', function (e) { 
    e.preventDefault(); 
    var formdata = new FormData($('.contact form').get(0)); 
    $.ajax({ 
      url: $("#contactform").attr('action'), 
      type: 'POST', 
      data: formdata, 
      processData: false, 
      contentType: false, 
      //success 
      success: function (result) { 
       //Code here 
      }, 
      error: function (xhr,responseText,status) { 
       //Code here 
      } 
    }); 
}); 

e nel controller ho cercato di riceverlo come di seguito:

public JsonResult ContactPost(ContactUsDataModel model) 
{ 
    var name=model.ContactName; //null 
    /*Fetch the data and save it and return Json*/ 
    //model is always null 
} 

Per qualche motivo il modello di cui sopra è sempre null. Ma questo funziona se mi riferisco al model come HomeViewModel model invece di ContactUsDataModel model nel parametro di controllo come di seguito:

public JsonResult ContactPost(HomeViewModel model) 
{ 
    var name=model.CUDModel.ContactName; //gets value 
    /*Fetch the data and save it and return Json*/ 
    //Model is filled. 
} 

La mia domanda è, anche se riempio model di tipo ContactUsDataModel nella vista sto ottenendo come null se riferimento direttamente, ma ContactUsModel che è all'interno di HomeViewModel ottiene pieno. Qui non è importante il tipo di modello. La gerarchia è la sua riferita è necessaria durante il recupero nel controller?

+0

sguardo attributi di nomi di ingressi nell'origine vista del browser - che punta voi fuori – Igor

+0

@ haim770 Mi rifugio' t provato .. Provalo una volta .. –

+0

Beh, il nome dell'attributo sarà un po 'di 'CUDModel.ContactName' @Igor .. Questo ha senso dato che è recuperato da' homeviewmodel' ma mantiene la stessa struttura quando è postato .. Questo è quello che mi confonde con .. –

risposta

4

Bene, se il nome generato è <input>CUDModel.ContactName anziché ContactName, il modello predefinito di Raccoglitore non sarebbe in grado di collegarlo.

Fortunatamente, è possibile utilizzare il [Bind] attributo con prefisso:

public JsonResult ContactPost([Bind(Prefix="CUDModel")]ContactUsDataModel model) 
{ 
    // ... 
} 

Vedi MSDN

+0

Beh, questo ha senso ora .. Voglio dire c'è qualche opzione per superarlo .. Non era a conoscenza di 'Bind' molto .. Grazie per la condivisione, implementerò questo e se va bene +15 per te ..:) –

1

Utilizzando il browser Web, ispezionare ciascuna proprietà "nome" dell'elemento di ingresso DOM. MVC mappa automaticamente le proprietà dai tuoi ingressi alla classe usando la proprietà "nome" dell'input.

Per risolvere questo problema è possibile creare un raccoglitore modello personalizzato o creare manualmente gli input, specificando la proprietà del nome in modo che il raccoglitore automatico modello possa abbinarli alle proprietà della classe.

Tuttavia, non c'è niente di sbagliato nell'azione del controller che richiede HomeViewModel come argomento.

Altre informazioni trovate here.

+0

Beh, il link ha aiutato a capire alcuni concetti, +1 per quello, ma in realtà non ha risolto la mia domanda ... Ho anche provato a dare 'name' come separato' attributo html' ma il modello 'sovrascritto' it .. I aspetterò ancora un po 'di tempo e vedrò che se qualcuno si presenta con una spiegazione adeguata, altrimenti andrà ad accettare questa come risposta .. Grazie per il tuo tempo e impegno .. –

1

La vista visualizza il Tipo a cui si è fatto riferimento nella vista - @model ProjectName.Models.HomeViewModel - CUDModel è semplicemente una proprietà di HomeViewModel.

+0

Capisco quella parte @viperguynaz, ma sono confuso con la sua struttura .. Anche se lo stesso modello è riempito perché non lo accetta direttamente? –

+0

Poiché la tua vista è fortemente scritta come 'HomeViewModel' – viperguynaz

+0

Quindi mantiene la sua struttura quando è pubblicato indipendentemente dalle proprietà del modello base? –

Problemi correlati