2011-11-24 59 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) { ... } 
} 
相关问题