Cómo simplificar mis diálogos modales entrelazados statefull en ASP.NET MVC

Necesito mantener el estado en diálogos modales de muchos a muchos en una forma de mejora progresiva en el proyecto ASP.NET MVC.
En mi código cuando javascript está deshabilitado, el cuadro de diálogo modal cambia la navegación a otra página y lo devuelve, pero cuando javascript está habilitado, el cuadro de diálogo se abre como un cuadro de diálogo modal jquery, está bien.
Estoy usando este método para seleccionar la acción de hacer clic en ver.
El siguiente código muestra una página de detalles de llamadas a la página maestra, está la vista y el controlador. Solo hay un maestro llamando a un cuadro de diálogo de detalles, pero tengo otras vistas / controladores donde un maestro puede llamar a muchos cuadros de diálogo de detalles diferentes y, a veces, un cuadro de diálogo puede comportarse como una página maestra y llamar a otro cuadro de diálogo nested. Todo debe mantener el estado entre llamadas.

El problema es que es muy complejo, hay un montón de código para mantener el estado y administrar el diálogo, necesito repetir el mismo código de JavaScript y de controlador en todas partes, deseo alguna manera de simplificarlo.
En el lado de la vista, las secuencias de comandos deben volverse genéricas para pasar a un archivo .js separado y mantener un mínimo de javascript.
En el lado del controlador busco mucho por alguna forma genérica para hacerlo como un filtro o carpeta personalizada, pero no puedo encontrar.

CONTROLADOR

//###################################################################### using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using HYW.Models; using HYW.Helpers; namespace HYW.Controllers { public class TesteController : Controller { //------- private object getValue(string key) { return Session[key]; } private void setValue(string key, object value) { Session[key] = value; if (value == null) { Session.Remove(key); } } //------- [AcceptVerbs(HttpVerbs.Get)] public ActionResult createitem() { setValue("item", null); setValue("detail", null); return View("item"); } //------- [HttpPost] [ValidateAntiForgeryToken] [HlpFltButtonSelector(Name = "action", Argument = "saveitem")] public ActionResult saveitem(testePg01 model) { ModelState.Clear(); return View("item", model); } //------- [HttpGet] public ActionResult opendialog() { ModelState.Clear(); testePg02 p2 = (testePg02)getValue("detail"); if (p2 == null) { p2 = new testePg02(); } return View("detail", p2); } //------- [HttpPost] [ValidateAntiForgeryToken] [HlpFltButtonSelector(Name = "action", Argument = "opendialog")] public ActionResult opendialog(testePg01 model) { ModelState.Clear(); setValue("item", model); testePg02 p2 = (testePg02)getValue("detail"); if (p2 == null) { p2 = new testePg02(); } return View("detail", p2); } //------- [HttpPost] [ValidateAntiForgeryToken] [HlpFltButtonSelector(Name = "action", Argument = "savedialog")] public ActionResult savedialog(testePg02 model) { ModelState.Clear(); setValue("detail", model); testePg01 p1 = (testePg01)getValue("item"); if (p1 == null) { p1 = new testePg01(); } p1.p02 = model; return View("item", p1); } //------- [HttpPost] [ValidateAntiForgeryToken] [HlpFltButtonSelector(Name = "action", Argument = "canceldialog")] public ActionResult canceldialog(testePg02 model) { ModelState.Clear(); testePg01 p1 = (testePg01)getValue("item"); setValue("detail", null); if (p1 == null) { p1 = new testePg01(); } p1.p02 = null; return View("item", p1); } //------- } } //###################################################################### 

VER

 @model HYW.Models.testePg01 @{ ViewBag.Title = "ITEM"; }  //------------------------------------------------- var url_trg = '@Url.Content("~/Teste/opendialog")'; var url_prl = '@Url.Content("~/Images/waitplease.gif")'; //------------------------------------------------- function onloadpartial() { configDetailDialog(url_trg, "#tempcontent", "section[id='main']", "Detail", "#opendialog"); } //------------------------------------------------- function configDetailDialog(trgurl, containerselector, contentselector, dlgtitle, buttonselector) { //------- $(document).ajaxError( function (event, jqXHR, ajaxSettings, thrownError) { alert('[event:' + event + '], ' + '[jqXHR:' + jqXHR + '], ' + '[jqXHR_STATUS:' + jqXHR.status + '], ' + '[ajaxSettings:' + ajaxSettings + '], ' + '[thrownError:' + thrownError + '])'); }); //------- $.ajaxSetup({ cache: false }); //------- $(buttonselector).click(function (event) { event.preventDefault(); openAjaxDialog(trgurl, containerselector, contentselector, dlgtitle); }); //------- } //------------------------------------------------- function openAjaxDialog(trgurl, containerselector, contentselector, dlgtitle) { $.ajax({ type: 'GET', url: trgurl, context: document.body, success: function (data) { var dlg = $(data).find(contentselector); $('#dlgdetail').remove(); $(containerselector).append("
"); $('#dlgdetail').append(dlg); $('#dlgdetail') .css("border", "solid") .dialog({ autoOpen: true, modal: true, title: dlgtitle, open: function () { configDetailDialog(); }, close: function (event, ui) { $('#dlgdetail').remove(); } }) .find("form").submit(function (event) { alert('clicou ' + event); var form = $(this); var faction = "http://" + window.location.host + trgurl; var fdata = form.serialize() + "&action:savedialog=savedialog"; $.ajax({ type: "POST", url: faction, data: fdata, success: function (result) { alert(result); } }); event.preventDefault(); $('#dlgdetail').dialog('close'); }); } }); } //-------------------------------------------------
@Html.ValidationSummary(true, "Erro na pagina.") @using (Html.BeginForm()) { @Html.AntiForgeryToken()
Item
@Html.LabelFor(m => m.p01campo01)
@Html.TextBoxFor(m => m.p01campo01) @Html.ValidationMessageFor(m => m.p01campo01)
@Html.LabelFor(m => m.p01campo02)
@Html.TextBoxFor(m => m.p01campo02) @Html.ValidationMessageFor(m => m.p01campo02)

}

nadie realmente quiere ayudarte aquí jaja!
Alguien aquí encontró una aplicación llamada jqgrid-for-plsql en el código de google que puede ayudarlo con algunas ideas.
Alguien aquí le cuenta sobre algunos problemas que puede encontrar con eso.
Deje que jqgrid haga todo el trabajo por usted en el lado de la vista y olvídese de la independencia de JavaScript.
jqGrid es gratuito y crea automáticamente la cuadrícula con paginación, CRUD en línea, forma modal generada de metadatos CRUD, grillas anidadas, soporte para archivos de FK en grilla y edición.
Alguien aquí está contando sobre otra biblioteca llamada aspnetawesome.
Alguien aquí está contando sobre la validación en este contexto.