可以在Razor页面之外使用Html Helpers

时间:2011-08-01 10:20:48

标签: asp.net-mvc-3 razor actionlink

我有一个用作ViewModel的类'IncomeStatement'。这个类有一个属性,可以生成一些相当复杂的html:

public MvcHtmlString HtmlPeriods { get; set; }
.... 
StringBuilder htmlPeriods = new StringBuilder(100);
htmlPeriods.AppendFormat(
"<td><a href='/Forecast/IndexPeriod?Period={1}'>{0}</a></td>",
    inc.NetSales, per.Period.PeriodID);
....
HtmlPeriods = MvcHtmlString.Create(htmlPeriods.ToString())

然后在Razor文件中我使用HtmlPeriods属性,它可以正常工作:

<th></th>@Model.HtmlPeriods<td></td>

但是,如果我想在我的班级中使用Html.ActionLink(...)来创建很好的Razorlike链接, 像这样的东西:

string forecastLink = 
Html.ActionLink("Edit Forecast", "/Forecast/IndexEdit?PeriodID=2005Q1");

我该怎么做?

2 个答案:

答案 0 :(得分:4)

您可以使用HtmlHelper类来执行此操作。我想你会想要GenerateLink方法。

示例:

string link = HtmlHelper.GenerateLink(HttpContext.Current.Request.RequestContext, System.Web.Routing.RouteTable.Routes, "My link", "Default", "Index", "Home", null, null);

答案 1 :(得分:0)

在您的情况下,定义HTML帮助程序而不是在模型上使用属性和方法更为正确。例如:

using System.Web.Mvc;
using System.Web.Mvc.Html;

public static class HtmlExtensions
{
    public static MvcHtmlString HtmlPeriods(this HtmlHelper<SomeViewModel> html)
    {
        // here you can use html.ActionLink in order
        // to generate the desired markup

        // you also have access to the view model here:
        SomeViewModel model = html.ViewData.Model;

        ... 
    }
}

然后在你看来:

@Html.HtmlPeriods()