2013-11-16 4 views
0

Интересно, почему ContactModel в ContactController не заполнен значениями, указанными в форме. Где моя голова взорвалась?Модель пуста после отправки

код как:

HomeController (где контактная форма)

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var viewModel = new HomeViewModel(); 
     return View(viewModel); 
    } 
} 

ViewModel для дома

public class HomeViewModel 
{ 
    public ContactModel ContactModel { get; set; } 
} 

ContactModel для хранения значений

public class ContactModel 
{ 
    [Required(ErrorMessage = "Required")] 
    public String Name { get; set; } 

    [EmailAddress] 
    [Required(ErrorMessage = "Required")] 
    public String Email { get; set; } 

    [Required(ErrorMessage = "Required")] 
    public String Message { get; set; } 
} 

Index View для HomeController

@model MyNameSpace.ViewModels.HomeViewModel 

@using (Html.BeginForm("Send", "Contact", FormMethod.Post)) 
{ 
    <div class="form-group"> 
     @Html.LabelFor(model => model.ContactModel.Name, "Name", new { @class = "sr-only" }) 
     @Html.TextBoxFor(model => model.ContactModel.Name, new { @class = "form-control", @placeholder = "Name" }) 
    </div> 
    <div class="form-group"> 
     @Html.LabelFor(model => model.ContactModel.Email, "E-mail", new { @class = "sr-only" }) 
     @Html.TextBoxFor(model => model.ContactModel.Email, new { @class = "form-control", @placeholder = "E-mail" }) 
    </div> 
    <div class="form-group"> 
     @Html.LabelFor(model => model.ContactModel.Email, "Message", new { @class = "sr-only" }) 
     @Html.TextAreaFor(model => model.ContactModel.Message, new { @class = "form-control", @placeholder = "Message" }) 
    </div> 
    <p><button type="submit" class="btn btn-default">Send</button></p> 
} 

ContactController Отправить

public class ContactController : Controller 
{ 
    [HttpPost] 
    public ActionResult Send(ContactModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // ModelState is not valid - but why!? 
      return RedirectToAction("Index", "Success"); 
     } 

     return RedirectToAction("Index", "Error"); 

    } 

} 

По какой-то причине на моей форме представить, модели, представленной в ContactController.Send(ContactModel model) имеет все нулевые значения - где ссылка сломана?

ответ

1

Ваше действие POST должны принять модель представления в качестве параметра вместо модели домена:

[HttpPost] 
public ActionResult Send(HomeViewModel model) 

Причина этого довольно проста - это путь модели по умолчанию Связующие работы в. Ваши поля ввода в представлении имеют префикс ContactModel.

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

[HttpPost] 
public ActionResult Send([Bind(Prefix = "ContactModel")] ContactModel model) 
+0

Так что лучший дизайн, если я хочу использовать (модель ContactModel) ContactController.Send из нескольких мест, я бы переместить его в какой-то помощник класс или что такое хороший дизайн? – janhartmann

+0

В этом случае я не вижу большой пользы от этого класса HomeViewModel, который вы использовали в представлении. Все, что он делает, - это перенос вашей модели домена в свойство, которое не должно работать на моделях представления. –

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