【问题标题】:.NET MVC Explicit Views.NET MVC 显式视图
【发布时间】:2010-09-20 13:46:44
【问题描述】:

嘿,这里还有一个新手,正在玩弄 .NET MVC。我的主要任务是在 URL 上创建一些半静态页面,例如:

  • /关于/
  • /关于/联系人/
  • /关于/工作/

我正在使用一个名为 Static 的控制器,并附加了以下路由:

routes.MapRoute(
  "About",
  "about/{id}",
  new { controller = "Static", action = "Index", id = UrlParameter.Optional }
);

它似乎工作正常,因为我有带有 Index 方法的静态控制器,该方法使用 switch 语句来识别必须查看哪个页面。我使用 RedirectToAction() 函数来调用静态控制器的其他操作,以便显示具有其他视图的页面。我的观点是:

  • /Static/About.aspx
  • /Static/Contacts.aspx
  • /Static/Jobs.aspx

此方法似乎工作正常,但我不喜欢它的是重定向,所以浏览到 /about/contacts 我会重定向到 /Static/Contacts 这不是我真正想看到的在网址中。

所以我的问题是 - 这样做的正确方法是什么?有没有办法从我的索引操作中显式调用某个视图?

谢谢, 〜K。

【问题讨论】:

  • +1 静态路由的好问题。

标签: c# asp.net-mvc


【解决方案1】:

不要进行重定向。不要在 Index 操作中使用 switch 语句,而是为每个页面(即 About、Contacts、Job)设置一个单独的操作,每个页面都有自己的视图。

您的Static 控制器可能如下所示:

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

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

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

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

如果您需要对ContactsJobs 进行任何特定的处理,可以在它们各自的操作中完成。

显式调用某个视图:

return View("ViewName");

View() 方法有七个重载。其中一些允许您通过模型:

return View("ViewName", Model);

【讨论】:

  • 谢谢,您的回答是正确的,也许我的问题不是。我使用您的建议创建了我的静态控制器,并设置了 About、Contacts 和 Jobs 操作,路由它们,一切似乎都很好。唯一需要注意的是 URL 中的大写字母 ;)
  • 也许关于显式调用视图的另一个问题是,如何显式调用视图并传递一些视图模型?
  • @kovshenin:对不起。应该是return View("ViewName")。我将编辑上面的答案。至于大写 URL,您为什么要担心?我假设这是在 IIS 上运行的,它具有不区分大小写的 URL。 http://yourdomain.com/About 将被视为与 http://yourdomain.com/about 相同。
【解决方案2】:

我建议您离开 Static,并拥有一个 About 控制器。在该控制器中,每页一个方法。

public ActionResult About() 
{
   return View ("About");
}

//Jobs() and Contacts() follow the same pattern

要匹配的3条路线:

routes.MapRoute(
  "Jobs",
  "about/jobs",
  new { controller = "About", action = "Jobs" }
);

routes.MapRoute(
  "Contact",
  "about/contact",
  new { controller = "About", action = "Contact"  }
);

routes.MapRoute(
  "About",
  "about/",
  new { controller = "About", action = "About" }
);

【讨论】:

  • 你不需要这 3 条路线,默认路线可以完美运行。
  • 我同意这个帖子和上面的评论。
【解决方案3】:

您不能从不同的控制器返回视图并在 URL 中包含第一个控制器。

唯一的方法是使用你的 about 控制器。

所以将你的逻辑放在你的 about 控制器中。

在我的管理控制器中我自己也有同样的情况。它只是一个带有一些静态链接和一些额外页面的页面。

在我拥有的 index.aspx 中

<ul>
    <li>
        <%= Html.ActionLink("Evaluaties", "Evaluaties", "Admin")%></li>
    <li>
        <%= Html.ActionLink("ONAS aanbieders", "Index", "ONASAanbieder")%></li>
    <li>
        <%= Html.ActionLink("ONAS aanbod", "Index", "ONASAanbod")%></li>
    <li>
        <%= Html.ActionLink("Helpbox", "Index", "HelpBox")%></li>
</ul>

在我拥有的控制器中

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

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

这就像你描述的那样工作,不需要改变路线。 显然我在Admin 文件夹中的Views 文件夹中有一个Evaluaties.aspx

给我这个网址:http://localhost:50152/Admin/Evaluaties

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2019-01-08
    相关资源
    最近更新 更多