剃须刀视图中的自定义模板

本文关键字:自定义 视图 剃须刀 | 更新日期: 2023-09-27 18:36:28

我正在尝试将一些自定义模板应用于剃须刀视图。它有点特别,所以这里有一个例子。

假设模型包含一个带有名字和姓氏的 Person 对象。

模板看起来像我会在 cshtml 文件中写的这个女巫

<div data-template-id="testTemplate" data-template-model="@Model.Person">
<span>{{Firstname}}</span>
<span>{{Lastname}}</span>
</div>

然后,我将创建一个 HtmlHelper 方法,该方法使用来自 Model.Person 的数据填充模板。

所以哈尔我已经可以访问数据,但我不确定如何访问视图并获取模板。

public static MvcHtmlString Test<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression){
    var model = html.ViewData.Model;
        string propName = "";
        if (expression.Body is MemberExpression)
            propName = ((MemberExpression)expression.Body).Member.Name;
        var value = model.GetType().GetProperty(propName).GetValue(model, null);
        // TODO: get template and insert data from model
        return new MvcHtmlString($"<div>{value}</div>");
}

我知道我为什么要这样做有点奇怪。但简短的回答是,在某些情况下,我需要根据一些内部条件返回一些完全不同的 html。在这种情况下,我只会完全删除模板。

剃须刀视图中的自定义模板

我自己找到了解决这个问题的方法。我最终传递了一个@helper方法作为模板。喜欢这个

public static MvcHtmlString Test<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
    var someCondition = false;
    if (someCondition)
    {
       // Return some domain specific html.
       return new MvcHtmlString("<div></div>");
    }
    else
    {
        var result = expression.Compile();
        TModel model = html.ViewData.Model;
        var value = result(model);
        var r = new MvcHtmlString(value.ToString());
        return r;
    }
}

然后我会像这样使用它:

@Html.Test(p => ImageTemplate(p.Avater))
@helper ImageTemplate(Picture avater)
{
    <h1 style="color: red">@avater.Title</h1>
    <h5>@avater.Url</h5>
}

这种方法提供了代码格式、智能感知、可重用性,当然还有覆盖漏洞的能力。