YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

时间:2022-09-05 19:08:38

上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法。

框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把查询结果的 HTML 代码呈现到 Razor 视图中,考虑到灵活性,需要能在任意 Razor 视图中调用该方法,这样任意 Razor 页面都能以统一的方式方便地共享该页面部件的 HTML 内容,这对于代码的重用性和可维护性都是非常有必要的。

为实现上述要求,本文介绍如下可供选择的三种方式。

  1、扩展静态类 Helper 方法,返回 HtmlString

  1)可参考如下代码:

public static class ImageHelper
{
  public static HtmlString Image(this HtmlHelper helper, string id, string url, string alternateText)
{
return Image(helper, id, url, alternateText, null);
} public static HtmlString Image(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes)
{
// Instantiate a UrlHelper
var urlHelper = new UrlHelper(helper.ViewContext.RequestContext); // Create tag builder
var builder = new TagBuilder("img"); // Create valid id
builder.GenerateId(id); // Add attributes
builder.MergeAttribute("src", urlHelper.Content(url));
builder.MergeAttribute("alt", alternateText);
builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); // Render tag
var ret = new MvcHtmlString(builder.ToString(TagRenderMode.SelfClosing)); return ret;
}
}

  2)此时界面可以这样调用:

@Html.Image("my-id", "~/Content/my-img.png", "Alt Text")

  总结:此方式最简单,但缺点也非常明显,因为是静态类,无法方便的进行依赖注入以调用其他实例方法。

  2、继承 WebViewPage<TModel> 实现自定义的 WebViewPage ,在子类中实现返回界面 HTML 字符串的方法。

此种方式可参照Abp框架中多语言的本地化实现过程,步骤如下:

  1)继承 WebViewPage 类

public abstract class AbpWebViewPage<TModel> : WebViewPage<TModel>

  2)实现方法,返回指定 Key 名称的本地化语言字符串

/// <summary>
/// Gets localized string for given key name and current language.
/// </summary>
/// <param name="name">Key name</param>
/// <returns>
/// Localized string
/// </returns>
protected virtual string L(string name)
{
return this._localizationSource.GetString(name);
}

  3)在 Web.config 中配置视图基类

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="Yb.AbpZero.Web.Views.AbpZeroTemplateWebViewPageBase">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.Optimization" />
<add namespace="Yb.AbpZero.Web" />
<add namespace="Yb.AbpZero.Localization" />
</namespaces>
</pages>
</system.web.webPages.razor>

  4)这样视图页面上就可以方便的调用 @L("Dashboard") 代码输出对应语言的字符串内容

  总结:此种方式需要在指定文件夹下的 Web.config 中配置页面视图的基类,在未配置的页面中无法进行方法的调用

  3、推荐的最佳方案

我们换种方式实现 Helper 方法,通过使用全局 Razor 视图中的 Helper 代码去访问后台方法并输出结果

  1)继承 System.Web.WebPages.HelperPage ,并重写 Html 属性

此处需要注意的是 System.Web.WebPages.HelperPage 的 Html 对象和如下重写的 Html 对象不是同一个类,为便于记忆、统一以 MVC Razor 中的关键字进行界面调用,我们此处还是把属性名称定义为 Html 。

public class HelperPage : System.Web.WebPages.HelperPage
{
// Workaround - exposes the MVC HtmlHelper instead of the normal helper
public static new HtmlHelper Html
{
  get { return ((WebViewPage) WebPageContext.Current.Page).Html; }
}
}

  2)把 Helper 方法放到 App_Code 文件夹下的 Razor 视图中

我们已经知道Razor可以访问本路径下其他 Razor 视图中定义的 Helper 方法,但现在我们考虑的是任意路径下 Razor 视图可均共享该 Helper 方法。

首先在 App_Code 文件夹下创建一个 Razor 视图,该视图将会被进行动态编译,通过 Razor 的视图引擎调用后台方法输出界面所需的 HTML 代码,代码如下:

@inherits YbRapidSolution.Mvc.HelperPage
@using System.Web.Mvc.Html
@helper Partial(string id)
{
Html.RenderAction("_Widget", "Home", new { id });
}

  3)我们在 _Widget 的后台方法中来访问数据库,然后生成页面部分视图并返回至界面,代码如下:

#region CMS部件呈现

/// <summary>
/// CMS部件呈现
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[ChildActionOnly]
public PartialViewResult _Widget(string id)
{
  if (string.IsNullOrEmpty(id))
  {
    return PartialView("E404");
  }   var widget = _widgetService.GetById(id);
  if (widget == null)
  {
    return PartialView("E404");
  }
  if (string.IsNullOrWhiteSpace(widget.TemplatePath))
  {
    return PartialView("_Widget", widget);
  }
  return PartialView(widget.TemplatePath, widget);
} #endregion 

  4)这样就可在任意页面进行调用如下代码生成界面所需的 Html 字符串,而字符串的内容则可放到数据库中,可在需要的时候在后台进行修改和维护:

@_Widget.Partial("31dbfb04b41e4883bab880ceec2cfef3")

YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

  总结:此种方式无需额外配置即可实现 Helper 方法的全局共享,调用的时候可以使用自己定义的标签,代码可读性更强。

YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法的更多相关文章

  1. YbSoftwareFactory 代码生成插件【十五】:Show 一下最新的动态属性扩展功能与键值生成器功能

    YbSoftwareFactory 各种插件的基础类库中又新增了两个方便易用的功能:动态属性扩展与键值生成器,本章将分别介绍这两个非常方便的组件. 一.动态属性扩展 在实际的开发过程中,你肯定会遇到数 ...

  2. 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧

    目录 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧 25.1 Shell中的色彩处理 25.2 awk基本应用 25.2.1 概念 25.2.2实例演示 25.3 awk ...

  3. YbSoftwareFactory 代码生成插件【十四】:通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页

    YbSoftwareFactory 的 YbRapidSolution for WinForm 插件使用CSLA.NET作为业务层,CSLA.NET的一个强大的特性是支持 N-Tiers 部署.只需非 ...

  4. YbSoftwareFactory 代码生成插件【十八】:树形结构下的查询排序的数据库设计

    树形结构的排序在中国特色下十分普遍也非常重要,例如常说的五大班子,党委>人大>*>政协>纪委,每个班子下还有部门,岗位,人员,最终排列的顺序通常需要按权力大小.重要性等进行排 ...

  5. YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧

    实体类通常需要和数据库表进行了ORM映射,当你需要添加新的属性时,往往同时也需要在数据库中添加相应的字段并配置好映射关系,同时可能还需对数据访问组件进行重新编译和部署才能有效.而当你开始设计一个通用数 ...

  6. YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器)

    程序=数据结构+算法,而企业级的软件=数据+流程,流程往往千差万别,客户自身有时都搞不清楚,随时变化的情况更是家常便饭,抛开功能等不谈,需求变化很大程度上就是流程的变化,流程的变化会给开发工作造成很大 ...

  7. 二十五、SAP中输出一条横线

    一.我们代码如下,这个是不输出横线的时候 效果如下 二.输出横线的代码如下 效果如下,多出一条横线

  8. 二十五、sql中where条件在数据库中提取与应用浅析

    问题描述 一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣.当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵盖了SQL的词法解析.语法解析.权限检查. ...

  9. 二十五、python中pickle序列学习&lpar;仅python语言中有&rpar;

    1.pickle序列介绍:提供4个关键字:dumps,dump,loads,load 语法:f.write(pickle.dumps(dict))=pickle.dump(dict,f) " ...

随机推荐

  1. 如何去各型MCU的官网上下载正确的数据手册

    一.背景 感谢老司机左栋,虽然他一直很排斥这个名号 : ) ,可就技术上来说,还是当之无愧的. 弄了1年多单片机了,数据手册不是老员工或者头头给,就是从开发板资料拿.一直没有意识到,官网的东西才是最可 ...

  2. 应用越来越广泛的css伪类

    说起css伪类,学习web前端网页设计的同学们应该对此应该不是很陌生,以前很多的网页的特效大多是通过js来实现的.但是随着CSS3不断开发,利用css实现网页的特效不仅响应不错,而且还减少了很多的代码 ...

  3. log4j的基本使用和参数设定

    1.简介 apache的一个开放源代码项目. 精确控制日志的输出,包括输出的格式,输出的目的地,输出的过滤(不同级别日志的输出)等. 配置简单,不需要在代码中配置环境,支持两种配置文件格式,XML和J ...

  4. 【BZOJ3531】旅行(树链剖分,线段树)

    [BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...

  5. &lpar;摘&rpar;sql-索引的作用&lpar;超详细&rpar;

    (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonc ...

  6. Linux操作系统df相关问题解惑

    1.df 命令无法使用解决办法 问题分析: 1.1 df命令是通过/etc/mtab文件读取已挂载文件系统的信息,因此,df命令无法使用的原因的在于/etc/mtab文件被损坏或者丢失. 查看 mor ...

  7. swiper h5学习

    http://www.swiper.com.cn/ 较多用于移动端

  8. 福大软工1816:Beta(1&sol;7)

    Beta 冲刺 (1/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 答辩 组织会议 复习课本 展示GitH ...

  9. springData 整合 Rrdis

    导包(使用maven的话,采用坐标的方式) <!-- redis nosql 内存数据库 --> <dependency> <groupId>redis.clien ...

  10. Openstack Havana的两个排错过程

    问题一:Timeout wating on RPC response, topic:"network" 描述: 启动实例一直等待,然后变为error.查看日志,是 timeout ...