所以我正在创建一个asp.NET MVC3应用程序,并希望将单页面应用程序功能应用于部分应用程序。我认为最简单的解释方法是举例:
该应用程序由一个管理区域和一个公共区域组成,使用普通的链接结构构建。我想将管理区域转换为单页面应用程序,重用现有应用程序中的视图和模型。是否可以这样做,在这种情况下如何?
答案 0 :(得分:2)
你必须面对两个主要问题,这使得SPA和标准应用程序之间存在差异:
为了解决这些问题,您必须在客户端和服务器端采取措施。 为了解释建议,让我们采取以下代码:
HomeController.cs:
public class HomeController : Controller {
public ActionResult Index() {
return View();
}
public ActionResult Contact() {
return View(new ContactUsViewModel());
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Contact(ContactUsViewModel model) {
if (ModelState.IsValid) {
/* Send mail / Save in DB etc. */
return Redirect("Index");
}
return View(model);
}
}
Index.cshtml:
<p>This is a simple page.</p>
<p>@Html.ActionLink("Click here to contact us", "Contact")
<强>客户端:强> 我们应该修复页面之间的链接以及表单提交。
链接:您可以在JS(jQuery,如果您愿意)中连接一个事件,该事件将针对您要在SPA上应用的区域中的每个链接点击进行观察 - 然后,而不是重定向用户 - 您将通过AJAX加载内容。 例如,看看这个示例:
$("a").click(function(e) {
e.preventDefault(); // Disable standard redirecting
var href = $(e.currentTarget).attr("href");
$.get(href, function(responseText) {
$("#main-content-wrapper").html(responseText);
});
});
表单:就像我们用于链接的approch一样,我们可以将观察者连接到JS中的表单提交事件,然后使用AJAX传输数据。 例如:
$("form").submit(function(e) {
e.preventDefault(); // Disable standard submittion
var data = $(e.currentTarget).serialize(); // Serializing the form data
var method = $(e.currentTarget).attr("method");
if (typeof (method) == "undefined") { method = "POST"; }
$.ajax({
method: $(e.currentTarget).attr("method"),
parameters: data,
statusCodes: {
404: function() { /* Handle it somehow */ }
403: function() { /* Handle it... */ }
200: function(response) {
/* Since we've done a form submittion, usurally if we're getting standard OK (200) status code - we've transffered a data - such as JSON data - indicating if the request success or we got errors etc. The code you're writing here depends on how your current application works. */
},
});
});
服务器端:强> 由于您不希望破坏当前的应用程序逻辑 - 您仍然必须能够使用标准的ASP.NET MVC方法 - 例如View(),Redirect()等。 在这种情况下,我建议您创建自己的自定义基本Controller类 - 它将覆盖ASP.NET基本实现。
例如,这是一个起点:
public class MyController : System.Web.Mvc.Controller {
public override View(string viewName) {
if (Request.IsAjaxRequest()) {
return PartialView(viewName); // If this is an AJAX request, we must return a PartialView.
}
return base.View(viewName);
}
}
你必须记住几件事:
正如您所看到的 - 您可以采取许多方法,它们取决于您开发网站的方式,您希望它如何工作以及您定义的基本规则(例如“否”)永远不允许重定向 - 即使在提交表单后“,”表单提交后 - 总是在操作成功的情况下 - 我正在显示消息或执行其他JS操作。因此,我可以覆盖Redirect(),如果这样是一个AJAX请求我可以返回一个JSON对象。“等等。”