Umbraco请求上下文中的MVC ActionLink?

时间:2014-05-07 14:05:56

标签: asp.net-mvc umbraco actionlink

我目前正在使用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页面一样带回样式吗?

感谢您的时间!

2 个答案:

答案 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或类似的东西。