【问题标题】:MVC ActionLink adviceMVC ActionLink 建议
【发布时间】:2016-07-21 15:27:00
【问题描述】:

我刚开始使用 .NET,并且正在构建一个测试应用程序。我目前使用DefaultControllerIndex() 操作方法设置主页。这按预期工作,主页是简单的 www.domain.com。

我使用Terms()Privacy() 操作方法在同一个DefaultController 下创建了2 个新页面(条款和隐私)。

我希望能够使用 URL 为 www.domain.com/terms 和 www.domain.com/privacy 浏览这些内容。

当我使用 <li>@Html.ActionLink("Terms of Service", "Terms", "Default")</li> 时,它可以工作,但它会将我带到 www.domain.com/Default/privacy 的 URL。

我应该为这些页面中的每一个创建单独的控制器,还是我错误地使用了@html.ActionLink 助手?我以前使用过<li><a href="~/privacy">Privacy Policy</a></li>,但我知道这不是最佳做法?

另外,有没有办法强制链接为小写?

我的控制器代码:

public class DefaultController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Terms()
    {
        return View();
    }

    public ActionResult Privacy()
    {
        return View();
    }
}

【问题讨论】:

  • 如果您将这些页面放在DefaultController 中并且您的助手看起来正确的操作链接,则不需要另一个控制器
  • 你能发布你的控制器代码吗?
  • 上面添加了控制器代码。目前都是非常基础的
  • 所以当您将鼠标悬停在您的Terms 链接上时,您会在左下角看到www.domain.com/Default/Privacy?
  • 正确。我希望看到 www.domain.com/Privacy 理想。

标签: asp.net-mvc html-helper html.actionlink


【解决方案1】:

如果这些在HomeController 中,我相信您不会遇到同样的问题。但是,我认为您可以通过使用RouteConfig 文件来解决此问题:

routes.MapRoute(
    name: "Default",
    url: "{Action}/{Id}",
    defaults: new { controller = "Default", Action = "Index", Id = UrlParameter.Optional }
);

routes.MapRoute(
    name: "Generic",
    url: "{controller}/{Action}/{Id}",
    defaults: new { Action = "Index", Id = UrlParameter.Optional }
);

【讨论】:

  • 我已经尝试过了,它确实适用于我上面的示例,但是它会更改所有其他控制器的路由。有没有办法我可以只为 DefaultController 映射一条路线,而没有别的?
  • @Gavin5511 你可以保留默认路由但先定义​​这个
  • 好的,很好。您是否有机会更新您的答案以展示我如何做到这一点?
  • 你不能有url: "{Action}/{Id}", - 那只是说任何有2段的url都会去DefaultControllerIndex()方法(默认路由永远不会被命中)
【解决方案2】:

我相信您想要做的是将控制器名称隐藏在 url 中。如果是这样,您的问题在这里得到解答:

ASP.NET MVC - Removing controller name from URL

我希望这会有所帮助:)

【讨论】:

    【解决方案3】:

    您可以使用属性路由为端点提供特定路由。

    [Route("terms")]
    public ActionResult Terms()
    {
        return View();
    }
    [Route("privacy")]
    public ActionResult Privacy()
    {
        return View();
    }
    

    在您的RouteConfig.cs 中,您必须使用以下代码行启用属性路由:routes.MapMvcAttributeRoutes();

    现在使用@Url.Action()@Html.ActionLink 生成的任何网址都应生成为 domain.com/privacy 和 domain.com/terms 的网址

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2013-10-21
      • 2015-03-12
      • 1970-01-01
      相关资源
      最近更新 更多