我正在使用Umbraco 7.6.6制作网站,我想访问我的客户端的第三方数据库。为此,我制作了一个名为QuestionsController
的自定义控制器。在此我已经创建了一个动作:
public class QuestionsController : SurfaceController
{
private QuestionService _questionService = new QuestionService();
[HttpGet]
public ActionResult Index()
{
return PartialView("~/Views/MacroPartials/Questions.cshtml", _questionService.ReadFile());
}
}
此页面索引页面工作正常,此代码在我的文档类型视图中调用:
Html.RenderAction("index", "Questions");
概览页(只是图片):
这是我创建的模型
public class Question
{
public int ID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public User User { get; set; }
public DateTime Created { get; set; }
public List<Comment> Comments { get; set; }
}
现在,我将创建一个详细信息页面,其中包含正面的更多信息。
[HttpGet]
[Route("~/questions/details/{id}")]
public ActionResult Details(int id)
{
return View(_questionService.ReadFile().ElementAt(id));
}
重定向到该页面,我会这样做:
<a href="~/questions/details/@q.ID">@q.Title</a>
但这根本不起作用。详细信息页面为我提供了404 (找不到页面)错误。
我现在的问题是:如何在没有文档类型的情况下创建~/questions/details/{id}
等自定义网址?有谁可以帮助我?
答案 0 :(得分:2)
以下是指南:
制作您的控制器并从Controller
而不是SurfaceController
延伸并返回JsonResult
而不是ActionResult
:
public class QuestionsController : Controller
{
private QuestionService _questionService = new QuestionService();
[HttpGet]
public JsonResult Index()
{
return Json(_questionService.ReadFile());
}
}
将控制器路径添加到umbracoReservedPaths
文件中的appSettings
web.config
密钥。 Umbraco的路由引擎将忽略添加到此列表中的任何路径。
<add key="umbracoReservedPaths" value="~/umbraco,~/install/,~/questions/" />
global.asax.cs
更改或添加global.asax.cs
以继承UmbracoApplication
。打开global.asax.cs
文件并更改此行:
public class MvcApplication : System.Web.HttpApplication
到此:
public class MvcApplication : UmbracoApplication
global.asax
将global.asax
更改为继承您的应用程序。这是抓住我的大问题,我不得不做很多搜索才能找到它!打开Global.asax
文件(右键单击它并查看标记)并更改此行:
<%@ Application Codebehind="Global.asax.cs" Inherits="Umbraco.Web.UmbracoApplication" Language="C#" %>
到此:
<%@ Application Codebehind="Global.asax.cs" Inherits="MyProject.MvcApplication" Language="C#" %>
此示例中的MyProject
是项目的基本命名空间。
RouteConfig.cs
如果存在,则从RouteConfig.cs
删除默认自定义路由。如果你不删除这条路线,MVC将尝试路由每个请求,你的网站将显示空页面,这可能是一个很好的干净设计,但功能不是很好!
使用RegisterRoutes
的{{1}}方法注册自定义路线。如果此文件不存在,请在文件夹RouteConfig.cs
下创建一个。您必须为要使用的每条路线执行此操作:
App_Start
routes.MapRoute("Default", "{controller}/{action}/{id}", new {
controller = "Questions",
action = "Index",
id = UrlParameter.Optional
});
最后,您需要向OnApplicationStarted
添加OnApplicationStarted
覆盖方法。这将允许您添加应用程序以在启动时阅读global.asax.cs
文件中的RegisterRoutes
方法,并将刚刚设置的自定义路由添加到应用程序中:
RouteConfig.cs
完成此步骤后,请删除下一行和文件。你不再需要了。
protected override void OnApplicationStarted(object sender, EventArgs e)
{
base.OnApplicationStarted(sender, e);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
为每个操作创建视图。你可以像经典的MVC应用程序那样做。