2015-10-18 11 views
6

Nie jestem pewien, czy dobrze sformułowałem pytanie w temacie, ale postaram się wyjaśnić, co w mojej mocy, na temat mojego pytania.Czy model zachowuje swoją strukturę po odebraniu danych w kontrolerze?

mam poniżej ContactUsModel która jest częścią HomeViewModel, lepiej powiedzieć zagnieżdżony model klasy w jednym model

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

i jestem coraz to Model, o których mowa w HomeViewModel jak poniżej:

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

Teraz w widoku Index.cshtml silnie utworzyłem widok formularza, jak poniżej:

@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"> 
} 

zrobić ajax posta jak poniżej:

$('#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 
      } 
    }); 
}); 

aw kontrolerze Próbowałem je otrzymać jak poniżej:

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

Z jakiegoś powodu powyższego modelu jest zawsze null. Ale to działa, jeśli odsyłam model jak HomeViewModel model zamiast ContactUsDataModel model w parametrze kontrolera jak poniżej:

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

Moje pytanie jest tu choć wypełnić model typu ContactUsDataModel w widoku otrzymuję go jako null jeśli odsyłasz bezpośrednio , ale ContactUsModel, które jest w środku HomeViewModel, zostanie wypełnione . Nie ma tu mowy o typie modelu. Czy wymagana hierarchia jest wymagana podczas pobierania w kontrolerze?

+0

obejrzenia atrybutów nazwa wejść w źródle widoku przeglądarki - że przewróci cię – Igor

+0

@ haim770 I haven” t próbowałem, że .. Spróbuję raz .. –

+0

Dobrze nazwa tego atrybutu będzie rodzaj 'CUDModel.ContactName' @Igor .. To ma sens, ponieważ jest pobierane z' homeviewmodel', ale robi to zachować taką samą strukturę, gdy jest opublikowali. To jest to, z czym jestem zdezorientowany .. –

Odpowiedz

4

Cóż, jeśli wygenerowana nazwa <input> brzmi CUDModel.ContactName zamiast po prostu ContactName, domyślny moduł wiązania modelu nie będzie w stanie go powiązać.

szczęście, można użyć [Bind] atrybutu z prefiksem:

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

Zobacz MSDN

+0

To ma teraz sens. Chodzi mi o to, że jest jakaś możliwość przezwyciężenia ... Nie wiedziałem o "Bind". Dzięki za udostępnienie, zaimplementuję to i jeśli pójdzie dobrze +15 dla ciebie ..:) –

1

Za pomocą przeglądarki internetowej sprawdź każdą właściwość "nazwa" elementu wejściowego DOM. MVC automatycznie mapuje właściwości z twoich danych wejściowych na klasę przy użyciu właściwości wejściowej "nazwa".

Aby rozwiązać ten problem, można utworzyć niestandardowy segregator lub ręcznie wprowadzić dane wejściowe, określając właściwość name w taki sposób, aby automatyczny segregator modelu mógł je dopasować do właściwości klasy.

Jednak nie ma nic złego w działaniu kontrolera przyjmującym HomeViewModel jako argument.

Więcej informacji, znaleziono here.

+0

Cóż, link pomógł ci zrozumieć kilka pojęć, +1 za to, ale to naprawdę nie rozwiązało mojego pytania ... Próbowałem też nadać 'name' jako oddzielnemu' atrybutowi html' ale model 'overrided' it .. I będzie czekać jeszcze trochę czasu i zobaczy, że jeśli ktokolwiek wymyśli odpowiednie wyjaśnienie, w przeciwnym razie pójdzie i zaakceptuje to jako odpowiedź .. Dziękuję za poświęcony czas i wysiłek .. –

1

Twój widok wyświetla typ, do którego odwołujesz się w widoku - @model ProjectName.Models.HomeViewModel - CUDModel jest po prostu właściwością HomeViewModel.

+0

Rozumiem tę część @viperguynaz, ale jestem zdezorientowany jej struktura .. Mimo że ten sam model jest wypełniony, dlaczego nie akceptuje go bezpośrednio? –

+0

Ponieważ widok jest silnie typowany jako 'HomeViewModel' – viperguynaz

+0

Czy zachowuje swoją strukturę podczas publikowania niezależnie od właściwości składających się na model podstawowy? –