2014-10-06 35 views
0

我試圖建立一個收件箱,這是非常類似於Facebook的消息收件箱,你有一個對話列表(我只想要一個消息標題列表),當你點擊對話或消息標題,我希望整個消息在局部視圖中呈現在旁邊。問題發送數據到PartialView C#MVC

這裏是我的收件箱視圖:

@model BlocketProject.Models.ViewModels.ProfilePageViewModel 
@{ 
ViewBag.Title = "Inbox"; 
} 

<h2>Dina meddelanden:</h2><br /> 

<div class="left"> 
    <table id="messageTable"> 
     @foreach (var message in Model.UserMessages) 
     { 
      <tr> 
       <td> 
        <button type="submit" class="messageButton"> 
         @if (message.Unread == true) 
         { 
          <h4 style="font-weight:bold;">@message.MessageTitle</h4> 
         } 
         else if (message.Unread == false) 
         { 
          <h4>@message.MessageTitle</h4> 
         } 

        </button> 
       </td> 
      </tr> 
     } 
    </table> 
</div> 
<div class="right"> 

    @Html.Partial("ReadMessage") 

</div> 

當我點擊這個消息元素是一個按鈕,我想通過這MESSAGEID到PartialView ReadMessage:

@model BlocketProject.Models.DbClasses.DbMessages 


<h2>@Model.MessageTitle</h2><br /> 
<p>@Model.MessageText</p> 

和控制器外觀像這樣:

 [HttpPost] 
    public ActionResult Inbox() 
    { 
     var allMessages = ConnectionHelper.GetAllMessages(ConnectionHelper.GetUserByEmail(User.Identity.Name).UserId); 
     var model = new ProfilePageViewModel(); 

     model.UserMessages = allMessages; 

     return View("Inbox", model); 

    } 

    [HttpPost] 
    public ActionResult ReadMessage(int messageId) 
    { 
     var model = ConnectionHelper.GetMessageByMessageId(messageId); 
     return PartialView("ReadMessage", model); 
    } 

我試着通過郵件傳遞messageId,你可以看到在我的控制器中,但然後partialView作爲新頁面返回,我只是想在收件箱視圖中呈現它。

任何想法?

編輯: Jonesy的答案固定我的問題,當我編輯這樣說:

控制器:

 public ActionResult ReadMessage(int messageId) 
    { 
     var model = ConnectionHelper.GetMessageByMessageId(messageId); 
     return PartialView("ReadMessage", model); 
    } 

景觀:運行

<div class="left"> 
<table id="messageTable"> 
    @foreach (var message in Model.UserMessages) 
    { 
     <tr> 
      <td> 
       @using (Ajax.BeginForm("ReadMessage", new { @messageId = message.MessageId }, new AjaxOptions { UpdateTargetId = "showMessage" }, FormMethod.Post)) 
       { 
        <button type="submit" class="messageButton"> 
         @if (message.Unread == true) 
         { 
          <h4 style="font-weight:bold;">@message.MessageTitle</h4> 
         } 
         else if (message.Unread == false) 
         { 
          <h4>@message.MessageTitle</h4> 
         } 
        </button> 
       } 
      </td> 
     </tr> 
    } 
</table> 
</div> 
<div class="right" id="showMessage"> 
@Html.Partial("ReadMessage", new BlocketProject.Models.DbClasses.DbMessages()) 
</div> 
+0

您必須對PartialView進行Ajax調用並獲取PartialView響應並更新視圖 – 2014-10-06 13:36:11

回答

1

剃刀在服務器上,之前該頁面呈現。一旦頁面在客戶端上,並且他們可以單擊消息,PartialView的概念就消失了 - 它只是一個HTML頁面。

要做到這一點,最簡單的方法是在您的按鈕所在的位置使用Ajax.BeginForm,單擊時使用從服務器檢索到的部分視圖更新元素。喜歡的東西:

@using(Ajax.BeginForm("ReadMessage", "Messages", new AjaxOptions() { UpdateTargetId = "showMessage" })) { 

//... 

} 

//... 

<div class="right" id="showMessage"> 
    //ReadMessage partial rendered on button click 
</div> 
+0

這會呈現選定div中的整個佈局,但不會顯示partialView。 :/ – deSex 2014-10-06 14:15:10

+0

如果ActionResults返回一個PartialView什麼也沒有發生,但是當我寫一個返回View()它會呈現整個頁面。 – deSex 2014-10-06 14:21:00

+0

你一定希望它返回一個PartialView。您可能需要調試它 – Jonesopolis 2014-10-06 14:21:51

0

一個小方法,可以幫助你:

protected ActionResult View(string viewName, object model) 
{ 
    if (ControllerContext.IsChildAction) 
     return PartialView(viewName, model); 
    else if (Request.IsAjaxRequest()) 
     return PartialView(viewName, model); 
    else 
     return View(viewName, model); 
} 

,當你打電話給你通過@ Html.RenderAction(動作這將返回一個PartialView)或致電通過Ajax的動作(jQuery的)。

然後,您可以使用jQuery來阻止表單發佈並將其發佈到Ajax中,或者當您單擊消息時,還可以使用jQuery從動作中獲取結果並將其插入到DOM中。

+0

謝謝您的回答,但我解決了上述解決方案。 但是這是一個有趣的方法,所以感謝分享! :) – deSex 2014-10-08 08:28:09