我目前正在使用Umbraco 6.1.6以及一些mvc视图和控制器。 我尝试做的是以下内容:
在我的剃刀视图中,我有以下行来创建一个actionlink:
@Html.ActionLink("Klik to search...", "Search", "Search", new { SearchText = "searchterm" }, null)
actionlink触发SearchController的Search方法(是一个SurfaceController):
public ActionResult Search(string SearchText)
{
if (String.IsNullOrEmpty(SearchText))
{
return RedirectToCurrentUmbracoPage();
}
SearchResult result = SearchManager.Instance.Search(SearchText);
return View("SearchResults", result);
}
当我在Html.BeginUmbracoForm中使用文本框和提交按钮时,这很有效但是当我使用Html.ActionLink时,RedirectToCurrentUmbracoPage会抛出异常(无法在路由值中找到Umbraco路由定义,请求必须在Umbraco请求的上下文),结果页面不使用指定的样式模板。
如何强制在Umbraco请求的上下文中制作ActionLink? 这会像其他Umbraco页面一样带回样式吗?
感谢您的时间!
答案 0 :(得分:1)
我认为您的搜索实际上是一个操作,而不是操作的链接。
在你的控制器中,我们应该看到这个
//This is to display the actual search form
[ChildActionOnly]
public ActionResult Search()
{
return PartialView("_SearchForm");
}
//This is to display the result of the search
[HttpPost]
[NotChildAction]
public ActionResult Search(string SearchText)
{
if (String.IsNullOrEmpty(SearchText))
{
return CurrentUmbracoPage();
}
SearchResult result = SearchManager.Instance.Search(SearchText);
return PartialView("_SearchResults", result);
}
在您的umbraco视图中,您应该使用Html.Action
来调用此表单@Html.Action("Search", "MySearchSurface")
答案 1 :(得分:0)
首先,您不应该使用表面控制器来呈现页面,就像搜索页面一样。相反,它们应该用于输出页面组件,例如搜索结果。
其次,您可以使用继承自RenderMvcController
的控制器作为搜索页。
最后,您无法真正使用Html.ActionLink
来检索Umbraco发布的网页的网址。请参阅my answer here以解释原因。相反,您需要使用Umbraco内容缓存,换句话说,遍历内容对象树以查找搜索页面,例如, @Model.Content.Ancestors(1).Descendants("SearchPage").First().Url
或类似的东西。