2011-11-24 19 views
2

我想爲每個接收方創建兩個部分視圖,並通過控制器中的發送方法進行連接。 Ajax Action調用需要div的Id,它必須被重新渲染。但我希望發送者完全脫離接收器。使用Razor MVC3的發送方 - 接收方

我可以在不使用AjaxOptions.UpdateTargetId的情況下重新渲染PartialView(例如在Controller本身中)?

這個想法是允許多個接收者連接到一個發件人(類似於WebParts機制)。

Index視圖:

@{ 
    ViewBag.Title = "Test Ground"; 
    var sender = (MVCPortalViewModel.Models.SenderModel)ViewBag.Model.PortletModels["Sender"]; 
    var receiver = (MVCPortalViewModel.Models.ReceiverModel)ViewBag.Model.PortletModels["Receiver"]; 
} 
<p>@Html.Partial("SenderPartView", sender)</p> 
<p>@Html.Partial("ReceiverPartView", receiver)</p> 

發件人查看:

@model MVCPortalViewModel.Models.SenderModel 

@using (Ajax.BeginForm("ApplyColor", "Test", new { Color = @Model.Color }, new AjaxOptions { UpdateTargetId = @ViewBag.SenderDivId, HttpMethod = "Post" })) 
{ 
    <div id="senderPartDiv" style="border: 1px solid black;"> 
     <div style="background-color: @Model.Color"> 
      <h2>@Model.Title</h2> 
     </div> 
      <p>Hallo @Html.ViewContext.HttpContext.User.Identity.Name</p> 
      <p> 
       @Html.Editor("Color") 
       <input type="submit" value="Apply Color" /> 
      </p> 
      <p> 
       @Ajax.ActionLink("Send Color", "SendColor", new { Color = @Model.Color }, new AjaxOptions { UpdateTargetId = @ViewBag.ReceiverDivId, HttpMethod = "Post" }) 
      </p> 
    </div> 
} 

接收器查看:

@model MVCPortalViewModel.Models.ReceiverModel 

<div id="receiverPartDiv" style="border: 1px solid black;"> 
    <h2 style="background-color: @Model.Color">@Model.Title</h2> 
    <p>Color: @Model.Color</p> 
</div> 

控制器:

public class TestController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Model = Model; 
     ViewBag.ReceiverDivId = "receiverPartDiv"; 
     ViewBag.SenderDivId = "senderPartDiv"; 
     return View(); 
    } 

    public ActionResult SendColor(string Color) 
    { 
     var receiverModel = ((ReceiverModel)Model.PortletModels["Receiver"]); 
     receiverModel.Color = Color; 

     ViewBag.ReceiverDivId = "receiverPartDiv"; 
     ViewBag.SenderDivId = "senderPartDiv"; 

     return PartialView("ReceiverPartView", receiverModel); 
    } 
} 
+0

我越思考這個問題,我越有感覺,你應該實現一個JavaScript解決方案。除非您在服務器上承擔其他責任,否則返回服務器僅用於更新本地視圖是沒有意義的。 – slfan

+0

這只是一個抽象的例子,可能在我需要的發送者 - 接收者解決方案中的服務器上承擔更多的責任(例如從服務器加載更多數據)。 我也更喜歡服務器版本,因爲它是單元可測試的。 –

回答

2

除了客戶端的JQuery方法,我想出了一個使用RenderAction和接收器的獨立控制器的解決方案。

索引視圖:

@model MVCPortalViewModel.Models.SenderModel 
<p>@Html.Partial("Sender", Model)</p> 
<p> 
    @{ Html.RenderAction("Receive1", "Receiver", Model); } 
    @{ Html.RenderAction("Receive2", "Receiver", Model); } 
</p> 

發件人PartialView:

@model MVCPortalViewModel.Models.SenderModel 
@using (@Html.BeginForm(new { Color = @Model.Color })) 
{ 
    <h2 style="background-color: @Model.Color;">@Model.Title</h2> 
    <p> 
     Send Color: 
     @Html.Editor("Color") 
     <input type="submit" value="Send Color" id="sendButton" /> 
    </p> 
} 

接收PartialView:

@model MVCPortalViewModel.Models.ReceiverModel 
<h2 style="background-color: @Model.Color">@Model.Title</h2> 
<p> 
    Color: 
    @Html.Display("Color") 
</p> 

控制器:

public class ChildActionController : Controller 
    { 
     public ActionResult Index(string Color) 
     { 
      SenderModel sender = new SenderModel { Title = "Sender", Color = "red" }; 
      if (!string.IsNullOrEmpty(Color)) 
      { 
       sender.Color = Color; 
      } 
      return View(sender); 
     } 
} 

接收控制器連接:

public class ReceiverController : Controller 
    { 
     public ActionResult Receive1(SenderModel Sender) 
     { 
      ReceiverModel receiver = new ReceiverModel { Title = "Receiver1" }; 
      receiver.Color = Sender.Color; 
      return PartialView("MessageReceiver", receiver); 
     } 
     public ActionResult Receive1(SenderModel Sender) { ... } 
} 
相關問題