2016-10-29 2 views
1

Я уже некоторое время борюсь с этой проблемой, и я не могу найти решение, которое решает его для меня.C# ASP.NET MVC - модель получает нуль на POST

Я пытаюсь добавить строку в моей модели в представлении, однако, когда модель получает вернулся в HttpPost все равно нулю для строки, которую я пытаюсь заполнить

Моя модель выглядит исключением это

namespace WhatsUp.Models { 
    public class ChatModel 
    { 
     public Account user { get; set; } 
     public Contact contact { get; set; } 
     public Chat chatA { get; set; } 
     public Chat chatB { get; set; } 
     public string newMessage { get; set; } 

     public ChatModel() { } 

     public ChatModel(Account user, Contact contact, Chat chatA, Chat chatB) 
     { 
      this.user = user; 
      this.contact = contact; 
      this.chatA = chatA; 
      this.chatB = chatB; 

     } 
    } 
} 

Мой контроллер выглядит следующим образом

namespace WhatsUp.Controllers 
{ 
    public class ChatsController : Controller 
    { 
     IMessageRepository repository = new DbMessageRepository(); 
     IContactRepository contactRepository = new DbContactRepository(); 
     IAccountRepository accountRepository = new DbAccountRepository(); 
     IChatRepository chatRepository = new DbChatRepository(); 

     // GET: Chats 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult Chat(int contactId) 
     { 

      Account user = accountRepository.GetAccount(User.Identity.Name); 
      Contact contact = contactRepository.GetContact(contactId); 
      Chat chatA = chatRepository.GetChat(user.id, contact.accountId ?? default(int)); 
      if(chatA == null) 
      { 
       chatRepository.CreateChat(user.id, contact.accountId ?? default(int)); 
      } 
      Chat chatB = chatRepository.GetChat(contact.accountId ?? default(int), user.id); 
      if(chatB == null) 
      { 
       chatRepository.GetChat(user.id, contact.accountId ?? default (int)); 
      } 
      ChatModel chatModel = new ChatModel(user, contact, chatA, chatB); 

      return View(chatModel); 
     } 

     [HttpPost] 
     public ActionResult Chat(ChatModel chatModel) 
     { 
      repository.SendMessage(new Message(0, chatModel.newMessage, chatModel.chatA.Id)); 
      ModelState.Clear(); 
      return View(chatModel); 
     } 


    } 
} 

И мой взгляд

@using WhatsUp.Models 
@model ChatModel 

@{ 
    ViewBag.Title = "Chat"; 
} 

<h2>Chat with @Model.contact.name</h2> 

<div id="chatWindow" style="overflow-y:auto; overflow-x:hidden; height:500px;">  

    <script> 
    var element = document.getElementById('chatWindow'); 
    element.scrollTop = element.offsetHeight 
    </script> 
</div> 


    @using (Html.BeginForm()) 
    { 
     @Html.TextAreaFor(x => x.newMessage, new { @class = "form-control"}) 
     <input type="submit" value="Send" class="btn btn-primary" /> 
    } 
+0

Сначала создайте ViewModel, который будет содержать ваше сообщение и идентификаторы чата. Создайте идентификаторы как скрытое поле в вашем представлении. В своем действии POST не забудьте получить каждый чат через свой идентификатор перед отправкой сообщения. – CodeNotFound

+0

@Broodstok Ваша 'Form' содержит только' TextBox' с именем 'newMessage'. В форме Post содержимое вашего текстового поля будет объектом модели newMessage. Причина остается пустой, потому что они не содержатся в форме. –

+0

@CodeNotFound Большое спасибо! Это сработало. –

ответ

0

Всегда используйте ViewModel для такого рода вещей. Выполните следующие шаги:

  • Сначала создайте ViewModel, в котором будет содержаться ваше сообщение и идентификаторы чата.
  • Во-вторых, ake id s как скрытое поле на ваш взгляд.
  • Последняя вещь, в вашем действии POST, чтобы получить каждый экземпляр Chat через их id перед отправкой сообщения.
Смежные вопросы