2015-10-18 3 views
6

Я не уверен, правильно ли сформулировал вопрос в теме, но я постараюсь объяснить все, что у меня есть.Поддерживает ли модель свою структуру, когда данные поступают в контроллер?

У меня есть ниже ContactUsModel который является частью HomeViewModel, лучше сказать, вложенной модели класса в одном model

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

и я получаю это Model упоминается в HomeViewModel, как показано ниже:

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

Теперь в Index.cshtml view Я сильно создаю вид формы, как показано ниже:

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

я ajax сообщение, как показано ниже:

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

и в контроллере я пытался получить его, как показано ниже:

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

почему-то выше модель всегда null. Но это работает, если я отсылаю model, как HomeViewModel model вместо ContactUsDataModel model в параметре контроллера, как показано ниже:

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

Мой вопрос здесь, даже если я заполняю model типа ContactUsDataModel в представлении я получаю как null если я обращаюсь к напрямую, но ContactUsModel, который находится внутри HomeViewModel получает заполнен. Здесь не тип модели. Требуется ли иерархия, указанная в ней , при сборке в контроллере?

+0

посмотреть на имя атрибутов входов в источнике Просм.об - что перевесит тебя – Igor

+0

@ haim770 I гавань» t попытался это .. Попробует это один раз .. –

+0

Ну имя атрибута будет своеобразным 'CUDModel.ContactName' @Igor .. Это имеет смысл, поскольку он извлекается из' homeviewmodel', но поддерживает ли он ту же структуру, когда это опубликовано .. Это то, что меня путают с ... –

ответ

4

Ну, если ваше сгенерированное имя <input> равно CUDModel.ContactName, а не просто ContactName, то по умолчанию Model-Binder не сможет его связать.

К счастью, вы можете использовать [Bind] атрибут с префиксом:

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

См MSDN

+0

Ну, это имеет смысл сейчас. Я имею в виду, что есть какой-то вариант, чтобы преодолеть это. Не знал о «Bind». Спасибо за совместное использование, я буду реализовывать это, и если он будет хорошо +15 для вас ..:) –

1

Используя ваш веб-браузер, проверьте каждое свойство «name» элемента ввода DOM. MVC автоматически отображает свойства из ваших входов в класс, используя свойство «имя».

Чтобы решить эту проблему, вы можете создать собственное связующее устройство или создать входные данные вручную, указав свойство name таким образом, чтобы привязка автоматической модели могла соответствовать их свойствам вашего класса.

Однако, нет ничего плохого в действии вашего контроллера, принимающего HomeViewModel в качестве аргумента.

Дополнительная информация, найденная here.

+0

Хорошо, что вы связали, помогли понять некоторые концепции, +1 для этого, но это действительно не решило мой вопрос ... Я также попытался дать 'name' как отдельный атрибут html', но модель' overrided' it .. I будет ждать еще некоторое время и увидеть, что если кто-нибудь придумает правильное объяснение, в противном случае пойдут и примут это как ответ .. Спасибо за ваше время и силы. –

1

Ваш вид опубликовывается Тип, на который вы ссылались в представлении - @model ProjectName.Models.HomeViewModel - CUDModel - это просто свойство HomeViewModel.

+0

Я понимаю эту часть @viperguynaz, но я смущен ее структура. Даже если та же модель заполнена, почему она не принимает ее напрямую? –

+0

Поскольку ваш вид строго типизирован как «HomeViewModel» – viperguynaz

+0

Так он сохраняет свою структуру при размещении независимо от свойств, состоящих из базовой модели? –

Смежные вопросы