扩展HtmlHelper类,用于在视图页面中直接利用后台@Html(HtmlHelper实例)的方法书写不会再被编码的前端代码
举例1: 结合TagBuilder书写Html标签内容
//步骤1: 创建一个自定义的HtmlHelper扩展方法
//首先,你需要创建一个静态类来包含你的自定义HtmlHelper扩展方法。例如,假设你想创建一个方法来生成一个带有特定样式的链接。
using System.Web.Mvc;
namespace YourNamespace.Extensions
{
public static class CustomHtmlHelpers
{
public static MvcHtmlString CustomLink(this HtmlHelper html, string linkText, string url, string cssClass)
{
var tag = new TagBuilder("a");
tag.Attributes.Add("href", url);
tag.Attributes.Add("class", cssClass);
tag.InnerHtml = linkText;
return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}
}
}
//步骤2: 在视图中使用自定义HtmlHelper
//一旦你创建了自定义的HtmlHelper扩展方法,你就可以在你的视图中直接使用它了。确保你的命名空间已经导入到视图中。
@using YourNamespace.Extensions
...
@Html.CustomLink("Visit our site", "https://www.example.com", "custom-link-class")
举例2:在前端视图页面中直接用后台代码生成javacript代码
//后代扩展HtmlHelper方法:
public static MvcHtmlString GetEnum(this HtmlHelper html, string enumKey, string enumName = "", string category = "", string subcategory = "")
{
if (string.IsNullOrEmpty(enumName))
enumName = enumKey;
enumName = enumName.Split('.').Last();
var json = FormulaHelper.GetService<IEnumService>().GetEnumJson(enumKey, category, subcategory);
string result = string.Format("var {0} = {1};", enumName, json);
return MvcHtmlString.Create(result);
}
//前端视图页面需要这段js代码的地方直接调用这个后台方法生成“var Sex=[...]”的代码
@Html.GetEnum("System.Sex")
在前端视图页面中直接用“@MvcHtmlString.Create("前端代码")”生成前端代码(比如在前端代码需要后端判断条件“@if”下才需要的场景中)
比如在前端代码段的以下代码:
@if (new MyProj.BLL.RoleBLL().GetUserRole(MyProj.UserHelper.UserID).Contains("AdminRole"))
{
@MvcHtmlString.Create(@"
mini.get(""btnSave"").set({ Enabled: true, Visible: true });
[""AttachFile1"", ""AttachFile2"", ""AttachFile3""].forEach(f => {
mini.get(f).setEnabled(true);
});
");
}
//后端角色判断条件成立时在前端页面相应位置插入该js代码(无需再经过编码):
mini.get("btnSave").set({ Enabled: true, Visible: true });
["AttachFile1", "AttachFile2", "AttachFile3"].forEach(f => {
mini.get(f).setEnabled(true);
});
转载并勘正自:https://blog.51cto.com/u_176133/3336084
Html.partial和RenderPartial的用法与区别
Html.partial和RenderPartial都是输出html片段,区别在于:
Partial 是将视图内容直接生成一个字符串并返回(相当于有个转义的过程),
RenderPartial方法 是直接输出至当前 HttpContext(因为是直接输出,所以性能好)。
因此它们在视图中的使用方式是不同的:
MVC2:
<%Html.RenderPartial("PartialView");%>输出到 HttpContext
<%=Html.Partial("PartialView")%> 输出为string 直接到页面
MVC3:
@Html.Partial("BasicChart")
@{
Html.RenderPartial("BasicChart");
}
Html.partial和RenderPartial的其它三个重载很有用:
第二个重载: @{Html.RenderPartial("BasicChart", model);}
用这个重载可以在部分视图里使用强类型,然后在主视图中使用第二个参数传model过去,而不用controller,比如从list中传其中一项myClass过去
第三个重载: 如:@{Html.RenderPartial("BasicChart", model, new ViewDataDictionary { { "key", "value" } };}
在第二个重载的基础上,增加一个参数传递ViewData
Partial 和RenderPartial:
这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样
Partial 回传的一个Object (MvcHtmlString), 回传一个String 把一堆Html给回传出来, 然后写进到主页面上
@Html.Partial("ViewName")
RenderPartial 回传的是void, 而这个方法会在主页面上添加指定的View
@{
Html.RenderPartial("ViewName");
}
这两个方法没有用到Controller Action, 是直接把一个View(Page) 给加进来,而RenderAction 有点不一样, 这是一个Action, 所以会用到Controller Action之后再回传一个页面
public class ChildActionOnlyTestController : Controller
{
[ChildActionOnly]
public ActionResult GetSupplierList()
{
var controller = new SupplierController();
return controller.SupplierList();
}
}


RenderPartial和RenderAction两者的相同点
通常都被用来显示一个功能相对独立的“块”,比如说显示菜单或者导航条。 两者输出的结果都被作为调用的View的一部分显示。
两者的不同点
- RenderPatial的数据来自于调用的View,而RenderAction来自自己。
- RenderAction会发起一个新的Request,而RenderPatial不会。【个人在实践中在Chrome的Network Tab发现从浏览器端发起的只有主体View页面的那个Request,Response一个组合后的页面, 由此可见该RenderAction发起的新的Request是在服务端一并请求后后主体View页面一并返回的】
@Html.Partial/@{Htmt.RenderPartial()}
@Html.Partial用于将分部视图渲染为字符串
@{Html.RenderPartial}将分布视图直接写入响应输出流,所以只能直接放在代码块中,不能放在表达式中(返回值是void)
RenderPartial因为是直接写在响应流中,所以性能会更好(微量影响),而Partial不用写在代码块中,所以更方便
@Html.Action()/@Html.RenderAction()
和Partial与RenderPartial类似,但是因为会通过Action,所以更灵活,可以利用控制器上下文。
在Action中可以通过IsChildAction来判断是被Url直接调用还是被Action()/RenderAction()调用
可以利用重载直接参数给Action。
RenderAction优先使用ActionNameAttribute。
Action中使用return PartialView()指定分部视图,在_ViewStatrt.cshtml中指定的Layout会无效。
4种PartialView对比:
PartialView
<div>Just a PartialView Test!@ViewBag.Test</div>
@ViewBag.Test
View:
<p>
@{Html.RenderPartial("ViewUserControl1");}
@Html.Partial("ViewUserControl1")
@{Html.RenderAction("ViewUserControl1");}
@Html.Action("ViewUserControl1")
</p>
Controller:
//Controller:
[ChildActionOnly] //防止直接调用
public ActionResult ViewUserControl1()
{
ViewBag.Test = "(Action)调用";
return PartialView();
}
效果:

------------------------------------------------------------------------------------------------------------------
以下内容为更早期转载自:
https://www.cnblogs.com/yaomeng/p/4833346.html
《MVC中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别》
Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的。
1. Html.RenderPartial是直接将用户控件嵌入到界面上:
<%Html.RenderPartial("LogOnUserControl");%>
或
<%Html.RenderPartial("~/Areas/Comm/Views/Shared/LogOnUserControl.ascx");%>
注意:用第一种方法时,用户控件必须放在调用者同一目录下,也可以放在View/Shared中。
2. Html.RenderAction则通过Controller中的Action来调用用户控件
Controller:用户控件所在Controller
public ActionResult UserControl()
{
return PartialView();
}
View:调用用户控件的View
< %Html.RenderAction("UserControl","Controller");%>
RenderPartial和RenderAction都是在Asp.net Mvc中用来显示PartialView的方法,所以在什么时候用哪个方法就是碰到的第一个问题。而要做出正确的选择就需要对这两个都有充分的了解,并且 知道其异同点。这也是本文的主题。
什么是Html.RenderPartial?
Html.RenderPartial在Asp.net Mvc中是用来调用PartialView的。PartialView基本上就是Asp.net Webform中的UserControl。调用也很简单,只要在View中把PartialView的名字作为参数传递就可以。比如:
<% Html.RenderPartial("YourPartialView", YourData); %>
YourData是一个可选的参数。如果有,那么YourData会被赋给PartialView中的Model。如果没有,那么调用 RenderPartial的View中的Mode和ViewData会被传递给PartialView。也就是说,PartialView的数据来自于 调用的View。
什么是Html.RenderAction?
Html.RenderAction允许你直接调用某一个Action,并把返回的结果直接显示在当前调用的View中。比如:
<% Html.RenderAction("Show", "Tag"); %>
此时,TagController中的Show方法会被调用。由于这时调用的是一个Action方法,因此可以在此方法中完成你想要完成的各种操作,比如从数据库,文件等获取数据,写数据等并返回结果。

[OutputCache(Duration=6000)]
public ActionResult Show()
{
var tagData = null;
//Get data from database
//tagData = tagService.AllHot();
return PartialView("TagCloud", tagData);
}

TagCloud是一个简单的PartialView文件而已。
两者的相同点
1.RenderPatial的数据来自于调用的View,而RenderPatial来自自己。
2.RenderAction会发起一个新的Request,而RenderPatial不会。【个人在实践中在Chrome的Network Tab发现从浏览器端发起的只有主体View页面的那个Request,Response一个组合后的页面, 由此可见该RenderAction发起的新的Request是在服务端一并请求后后主体View页面一并返回的】
如何选择
根据两者不同点中的第二点,由于RenderAction会调用一个新的Action方法,而Asp.net Mvc中Action是最小的缓存单位,因此如果某一个“块”的数据比较固定,不会因为访问者的不同而发生变化,那么这时就是使用 RenderAction的时候了。 题外话,对于RenderAction会发起一个新的Request,感觉对调用页面的流程有点破坏。一个View在显示的时候,自己又发起一个 Request去获取数据来显示,显然有点破坏了作为一个View的原则:A View should only know how to render, but not what to render!
对这四个的区别做一个总结,清理一下思路,方便以后使用:
1、带有Render的方法 @Html.Partial 对应 @{Html.RenderPartial(....);} @Html.Action 对应 @{Html.RenderAction(....);}
2、Action、RenderAction加载方法的视图,执行
3. Html.Partial可以直接提供用户控件名作为参数,而Html.Action需要有对应的Action,在Action内部返回PartailResult(即retun PartialView())。
4、对于简单的没有任何逻辑的用户控件,推荐使用Html.Partial;对于需要设置一些Model的用户控件,推荐使用Html.Action。当然,有Model数据也是可以使用Html.Partial方法的,可以看方法的重载。
5、使用Html.Action有个好处,就是可以根据不同的场景选择不同的用户控件。比如: @Html.Action("UserInfoControl") 在对应的UserInfoControl这个Action中,在用户未登录的时候,可以retun PartialView("LogOnUserControl");登录后,可以retun PartialView("UserInfoControl");
本文详细解析了MVC框架中Html.Partial和RenderPartial的使用方法及区别,阐述了它们在视图渲染上的作用,包括数据来源、性能影响以及何时选择使用哪一个。
707

被折叠的 条评论
为什么被折叠?



