简单的ASP.NET MVC CRUD视图在JavaScript UI对话框中打开/closures

我有各种简单的ASP.NET MVC视图的CRUD操作,它们自己作为一个简单的网页很好地工作。 我现在将它们整合到网站本身(进入内容),并有例如链接,如“创build新的职位”,将启动一个选定的灯箱克隆的视图(不知道哪一个,可能是彩盒或厚盒,但这并不重要)。

我想要实现的是,视图本身以某种方式检测到它是在JavaScript UI对话框中打开的,所以Form动作(通常是使用简单的Submitbutton的POST)将会用一个逻辑来呈现,行动已经完成。

现在工作的方式是POST / Redirect / GET。 视图应该仍然支持这个简单的模式,当直接通过URL在网页浏览器中打开,但应通过JavaScript对话框打开时提供一些额外的逻辑。

希望你能理解我的问题。 任何帮助赞赏

你好运,我已经做到了!

所以你需要的第一件事就是用一个新的ViewEngine来处理渲染页面,而不需要所有正常的页眉/页脚的东西,这些东西会阻碍你的模式窗口。 最简单的方法是为你的模态窗口使用一个大部分为空的主页面。 您希望主页面切换逻辑不会出现在自定义的ViewEngine中,否则每个控制器方法都必须在检测IsAjaxRequest()的地方遍历if()else()。 我喜欢干燥的撒哈拉沙漠。

有了这个技巧,我也有非常优雅的退化的优势。 我的网站完全没有JavaScript的function。 链接是好的,表单工作, 零代码更改从“模态意识网站”到普通的旧的HTML表单提交。

我所做的只是默认引擎的子类,并添加一些MasterPageselect位:

查看引擎:

public class ModalViewEngine : VirtualPathProviderViewEngine { public ModalViewEngine() { /* {0} = view name or master page name * {1} = controller name */ MasterLocationFormats = new[] { "~/Views/Shared/{0}.master" }; ViewLocationFormats = new[] { "~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx" }; PartialViewLocationFormats = new[] { "~/Views/{1}/{0}.ascx", }; } protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) { throw new NotImplementedException(); } protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) { return new WebFormView(viewPath, masterPath ); } public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) { //you might have to customize this bit if (controllerContext.HttpContext.Request.IsAjaxRequest()) return base.FindView(controllerContext, viewName, "Modal", useCache); return base.FindView(controllerContext, viewName, "Site", useCache); } protected override bool FileExists(ControllerContext controllerContext, string virtualPath) { return base.FileExists(controllerContext, virtualPath); } } 

所以我的Modal.Master页面非常简单。 我所有的是一个div包装,所以我知道什么时候在模态窗口内呈现东西。 只有当元素处于“模式模式”时,才需要使用jqueryselect某些元素。

Modal.Master

 <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> <div id="modalcontent"><asp:ContentPlaceHolder ID="MainContent" runat="server" /></div> 

下一步是创build你的表单。 我使用默认的属性名称=input名称,所以我可以轻松地build模绑定,并保持简单。 没有什么特别的forms。 我看起来就像通常那样 (注意我在我的代码中使用MVC 2和EditorFor(),但这应该不重要)这是我最后的HTML:

HTML输出

 <div id="modalcontent"> <h2>EditFood</h2> <div id="form"> <form method="post" action="/edit/food?Length=8"> <input id="CommonName" class="text-box single-line" type="text" value="" name="CommonName"/> <input class="button" type="submit" value="Edit Food"/> </form> </div> </div> 

除了很好的模型绑定外,您还可以使用Jquery.Form插件 ,使用最less的代码将无缝和简单的ajaxfunction分层到您的应用程序中。 现在我select了ColorBox作为我的模式窗口脚本,纯粹是因为我想Facebookesque透明的angular落,我喜欢作者添加的可扩展性点。

现在结合这些脚本,你会得到一个非常好的组合,这使得这个技术在JavaScript中很容易做到。 我唯一需要添加的是(在document.ready中):

使用Javascript / jQuery的

  $("a.edit").colorbox({ maxWidth: "800px", opacity: 0.4, initialWidth: 50, initialHeight: 50 }); $().bind('cbox_complete', function () { $("#form form").ajaxForm(function () { $.fn.colorbox.close() }); }); 

在这里,我告诉ColorBox打开我的编辑链接(编辑食品)的模式窗口。 然后绑定到colorbox的完整事件来连接你的ajaxform东西与成功callback告诉ColorBoxclosures模式窗口。 而已。

这个代码全部都是作为概念certificate来完成的,这就是为什么视图引擎非常简洁,没有任何validation或其他标准forms。 ColorBox和JQuery.Form有很多的扩展性支持,所以定制这个应该很容易。

注意这一切都是在MVC 2中完成的,但是这里是我的控制器代码,只是为了展示这是多么容易。 记住我的概念validation目标是让模态窗口以这样的方式工作,除了设置一些基本的基础架构之外,我不必做任何代码更改。

  [UrlRoute(Path="edit/food")] public ActionResult EditFood() { return View(new Food()); } [HttpPost][UrlRoute(Path = "edit/food")] public ActionResult EditFood(Food food) { return View(food); } 

在构buildjQuery的URL来执行AJAX GET时,可以添加一个查询string参数(如&javascriptWindow = id),如果在控制器中检测到这个参数,则可以在窗体中添加必要的逻辑以在执行后closures对话框。