using System.Web.Mvc;
using System.Web.UI;
namespace Messenger
{
public class AjaxViewPage<TModel> : ViewPage<TModel> where TModel : class
/// <summary>
/// The control that must be rendered as result of the AJAX request.
/// </summary>
public string RenderedControlId
get
object controlId = null;
ViewData.TryGetValue("__RenderedControlId", out controlId);
return (string)controlId;
}
protected override void Render(HtmlTextWriter writer)
if (RenderedControlId == null)
// The complete view must be rendered.
// We keep the default mechanism
base.Render(writer);
else
// Only the given control is rendered
Control control = FindControl(RenderedControlId);
control.RenderControl(writer);
namespace Messenger.Views.Shared
public partial class Index : AjaxViewPage<IndexViewData>
public class AjaxController : Controller
public BinaryResult Binary(string contentType, byte[] data)
return new BinaryResult() { ContentType = contentType, Data = data };
public AjaxViewResult Ajax(string selector)
return new AjaxViewResult().Add(selector, View());
public AjaxViewResult Ajax(string selector, ActionResult actionResult)
return new AjaxViewResult().Add(selector, actionResult);
public AjaxViewResult Ajax(string selector, ViewResult viewResult, string controlId)
return new AjaxViewResult().Add(selector, viewResult, controlId);
return Ajax("#panel", View("Index"), "ReadContactPanel")
.Add("#contacts", View("Index"), "ContactsPanel");
public static class AjaxExtensions
public static string Ajaxify(this AjaxHelper helper, params string[] selectors)
StringBuilder builder = new StringBuilder();
builder.Append("<script type=\"text/javascript\">$(document).ready(function() { ");
foreach (string selector in selectors)
builder.Append("$('" + selector + "').ajaxify();");
builder.Append("});</script>");
return builder.ToString();
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="New.ascx.cs" Inherits="Messenger.Views.Messages.New" %>
<form method="post" action="<%= Url.Action("Send", new { id = ViewData.Model } ) %>">
<textarea name="messagetext" cols="28" rows="3"></textarea>
<br />
<%= Html.SubmitButton("send", "Send") %>
</form>
<%= Ajax.Ajaxify("#panel form") %>