如何在ASP.NET MVC中简化我的状态隔行扫描模式对话框

我需要在ASP.NET MVC项目中以渐进增强方式保持多对多modal dialog的状态。
在我的代码中,当javascript被禁用时,modal dialog将导航转到另一个页面并返回,但是当启用javascript时,对话框打开为jquery模式对话框,其确定。
我正在使用此方法从点击视图中选择操作。
下面的代码显示了一个主页面调用详细信息页面,有视图和控制器。 只有一个主控制器调用一个详细信息对话框但我有另一个视图/控制器,其中一个主控制器可以调用许多不同的详细信息对话框,有时一个对话框可以像主页一样运行并调用另一个嵌套的对话框。 一切都必须保持呼叫之间的状态。

问题是它非常复杂,有很多代码可以保持状态和管理对话框,我需要在任何地方重复相同的javascript和控制器代码,我希望有一些方法来简化它。
在视图方面需要将脚本通用转移到单独的.js文件并继续查看最少的javascript。
在控制器方面,我搜索了一些通用的方法来做它像filter或自定义绑定器,但无法找到。

CONTROLLER

//###################################################################### 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); } //------- } } //###################################################################### 

视图

 @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)

}

没有人真的想帮助你在这里哈哈!
有人在谷歌代码上发现了一个名为jqgrid-for-plsql的应用程序,它可以帮助你提供一些想法。
有人在这里讲述你可以找到的一些问题。
让jqgrid在视图端为你做所有工作,忘记javascript独立性。
jqGrid是免费的,并自动创建网格,包括pagging,内联CRUD,元数据生成模式formsCRUD,嵌套网格,支持网格和版本中的FK文件。
这里有人在讲述另一个名为aspnetawesome的库。
这里有人在这些背景下讲述validation。