我有几个列出搜索结果的页面,对于我想要显示的每个结果,我想创建一个自定义的View Helper,以避免重复显示代码。
如何从自定义视图助手中访问方便的现有视图助手?即在我的自定义视图帮助器中,我想使用Url.Action(),Html.ActionLink等。如何从我的自定义视图助手中访问它们?
using System;
namespace MvcApp.Helpers
{
public class SearchResultHelper
{
public static string Show(Result result)
{
string str = "";
// producing HTML for search result here
// instead of writing
str += String.Format("<a href=\"/showresult/{0}\">{1}</a>", result.id, result.title);
// I would like to use Url.Action, Html.ActionLink, etc. How?
return str;
}
}
}
using System.Web.Mvc
可以访问HtmlHelpers
,但似乎没有像ActionLink这样的方便方法。
答案 0 :(得分:9)
这个例子可以帮到你。此帮助程序根据用户是否登录来呈现不同的链接文本。它演示了在我的自定义助手中使用ActionLink:
public static string FooterEditLink(this HtmlHelper helper,
System.Security.Principal.IIdentity user, string loginText, string logoutText)
{
if (user.IsAuthenticated)
return System.Web.Mvc.Html.LinkExtensions.ActionLink(helper, logoutText, "Logout", "Account",
new { returnurl = helper.ViewContext.HttpContext.Request.Url.AbsolutePath }, null);
else
return System.Web.Mvc.Html.LinkExtensions.ActionLink(helper, loginText, "Login", "Account",
new { returnurl = helper.ViewContext.HttpContext.Request.Url.AbsolutePath }, null);
}
修改强>
要访问Url.Action()
方法,您需要做的就是将this HtmlHelper helper
param替换为this UrlHelper urlHelp
之类的内容,然后只需调用urlHelp.Action(...
希望这有帮助。
答案 1 :(得分:1)
一个简单的gravatar html帮助器,你的类也需要是静态的。
public static string GetGravatarURL(this HtmlHelper helper, string email, string size, string defaultImagePath)
{
return GetGravatarURL(email, size) + string.Format("&default={0}", defaultImagePath);
}
答案 2 :(得分:0)
你可以使用扩展方法扩展默认的HtmlHelper和UrlHelper(所以你在方法中将xxxHelper作为第一个参数)。
或者您可以使用所需的方法创建基本视图,并使用视图的Html或URL变量。
答案 3 :(得分:-1)
在我看来,您不应该尝试在代码中使用ActionLink。 MVC的整个概念是将逻辑与显示分开,所以你应该试着坚持下去。
我建议你将结果对象传递给视图(可能通过ViewData),然后在视图中内联解析结果。 e.g。
<%= Html.ActionLink(result.title,"/showresult/" + result.id, "myController") %>