首先,就可用性和 SEO 而言,所谓的“优质内容”是您的用户可以链接到的内容。
如果您构建一个没有 URL 路径的“页面”,那么您的用户将无法链接到它、共享链接等。搜索引擎也将无法抓取它,因此它不会获得索引。
在某些情况下(安全问题),可能需要此行为以防止资源在用户之间共享。
标准方式
在这种情况下,您最好的选择是在 JavaScript 框架(如 AngularJS)的帮助下创建单页应用程序(请参阅此 tutorial 以开始使用)。与服务器交互(交换数据)的最佳选择是使用WebApi,但任何“导航”都完全在浏览器中进行。
非标准方式
另一个选项是在 MVC 中自定义路由,以便它可以从请求的另一部分读取导航,并提出一些自定义约定来确定从请求中生成哪些路由值,以便 MVC 知道要调用哪个控制器操作。您可以通过 custom RouteBase 实现来做到这一点。
这是一个例子:
查看
@using (Html.BeginForm())
{
<input type="hidden" name="location-controller" value="Home" />
<input type="hidden" name="location-action" value="Index" />
<input type="submit" value="Home" />
}
@using (Html.BeginForm())
{
<input type="hidden" name="location-controller" value="Home" />
<input type="hidden" name="location-action" value="Contact" />
<input type="submit" value="Contact" />
}
@using (Html.BeginForm())
{
<input type="hidden" name="location-controller" value="Home" />
<input type="hidden" name="location-action" value="About" />
<input type="submit" value="About" />
}
无路径路径
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication12
{
public class PathlessRoute : RouteBase
{
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData result = null;
var form = httpContext.Request.Form;
// Skip any forms that are not part of our scheme
if (form != null && form.HasKeys())
{
var controller = form["location-controller"];
var action = form["location-action"];
if (!string.IsNullOrWhiteSpace(action))
{
// Default controller to "Home"
if (string.IsNullOrWhiteSpace(controller))
{
controller = "Home";
}
result = new RouteData(this, new MvcRouteHandler());
result.Values["controller"] = controller;
result.Values["action"] = action;
// TODO: Work out scheme to pass custom route values (such as "id")
}
}
return result;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return null;
}
}
}
用法
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("Pathless", new PathlessRoute());
routes.MapRoute(
name: "Home",
url: "",
defaults: new { controller = "Home", action = "Index" }
);
}
}
现在,当您单击“联系”提交按钮时,您将获得联系视图,但该 URL 将没有指示您正在查看的页面的路径。
您可以通过创建自己的HTML helper extension method 来呈现您的表单标签,就像您可以使用ActionLink 创建超链接一样,来进一步改进。
@Html.ActionLinkPost(name: "Contact", action: "Contact", controller: "Home")
您甚至可以为按钮设置样式,使其看起来像超链接,或者使用一些 JavaScript 来制作发布的真正超链接。
但是,如果您沿着这条路走下去,您就是在新水域游泳,并且违反了标准的 HTTP 约定(例如,您正在使用不标准的 POST 导航)。您可以肯定,您不会在网络上找到很多(如果有的话)支持这种方法来克服您可能遇到的任何陷阱。