簡體   English   中英

剃刀視圖中的自定義模板

[英]Custom template in razor view

我正在嘗試將一些自定義模板應用於剃刀視圖。 這有點特殊,因此這里是一個示例。

可以說模型包含一個具有Firstname和Lastname的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>
}

這種方法提供了代碼格式化,智能感知,可重用性,當然還有覆蓋漏洞的能力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM