使用标记生成器和字符串生成器在htmlhelper类中创建表或使用HtmlTable有什么区别?
他们不是生成同样的事情吗?
TagBuilder是构建HTML元素的一个很好的实现.但是-some-HTML元素可以有另一个元素(我称之为子元素).我找不到Mvc课程的任何课程.
题; 我应该实现几个支持嵌套标签的类(TagBuilderTree和TagBuilderNode),还是我错过了什么?
我在MVC中创建自己的帮助器.但HTML中未添加自定义属性:
帮手
public static MvcHtmlString MenuItem(this HtmlHelper helper, string linkText, string actionName, string controllerName, object htmlAttributes)
{
var currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
var currentActionName = (string)helper.ViewContext.RouteData.Values["action"];
var builder = new TagBuilder("li");
if (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase)
&& currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase))
builder.AddCssClass("selected");
if (htmlAttributes != null)
{
var attributes = new RouteValueDictionary(htmlAttributes);
builder.MergeAttributes(attributes, false); //DONT WORK!!!
}
builder.InnerHtml = helper.ActionLink(linkText, actionName, controllerName).ToHtmlString();
return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal));
}
Run Code Online (Sandbox Code Playgroud)
CSHTML
@Html.MenuItem("nossa igreja2", "Index", "Home", new { @class = "gradient-top" })
Run Code Online (Sandbox Code Playgroud)
最终结果(HTML)
<li class="selected"><a href="/">nossa igreja2</a></li>
Run Code Online (Sandbox Code Playgroud)
请注意,它没有添加gradient-top
我在helper调用中提到的类.
我知道这是一种痴迷,但有没有办法控制TagBuilder
类在调用时呈现HTML标记属性的顺序ToString()
?
就是这样
var tb = new TagBuilder("meta");
tb.Attributes.Add("http-equiv", "Content-Type");
tb.Attributes.Add("content", "text/html; charset=utf-8");
tb.ToString(TagRenderMode.SelfClosing)
Run Code Online (Sandbox Code Playgroud)
将返回
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Run Code Online (Sandbox Code Playgroud)
不
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
Run Code Online (Sandbox Code Playgroud)
更改添加属性的顺序不会更改它,它似乎按字母顺序呈现
我正在尝试扩展 Html.ActionLink,因为我想为共享组件(在本例中为模态)添加自定义元数据。
我的目标是进一步扩展 .Net MVC 中的 LinkExtensions 类,它将向 html 类属性添加一个值并添加一个自定义数据属性,结果如下:
<a href="/Controller/Action/id" class="show-in-modal style1 style2" data-title="Modal title">Link</a>
Run Code Online (Sandbox Code Playgroud)
帮助器看起来类似于 MVC 方法:
public static MvcHtmlString ModalLink(this HtmlHelper htmlHelper, string title, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
{
// Add 'show-in-modal' class here
// Add 'data-title' attribute here
return htmlHelper.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes);
}
@Html.ModalLink("Modal title", "Link", "action", "controller", new { id = "id" }, new { @class = "style1 style2" });
Run Code Online (Sandbox Code Playgroud)
我遇到的这个问题是我无法轻松修改 htmlAttributes 对象以添加我的类名和数据属性,这是有道理的,因为这是一个只读的匿名对象。
有没有一种方法可以轻松应用所需的值/元数据,而不必通过反射将所有内容分开并重新组合在一起?
我注意到 MVC …
我的ASP.NET MVC应用程序有一个Html Helper文件.他们中的大多数只返回一个格式化的字符串.
以下是我的一个格式化字符串助手的示例:
public static string Label(this HtmlHelper helper, string @for, string text)
{
return string.Format("<label for \"{0}\">{1}</label>", @for, text);
}
Run Code Online (Sandbox Code Playgroud)
这是一个TagBuilder版本,它给出了与上面相同的结果:
public static string Label(this HtmlHelper helper, string @for, string text)
{
var builder = new TagBuilder("label");
builder.Attributes.Add("for", @for);
builder.SetInnerText(text);
return builder.ToString(TagRenderMode.Normal);
}
Run Code Online (Sandbox Code Playgroud)
现在,我已经从混合实现中读取/学习MVC的一些站点.有些人使用这种TagBuilder
方法,有些人则使用string.Format()
,有些人则互换使用.
标签标签相当简单,那么返回格式化的字符串而不是实例化TagBuilder
像这样的标签的类是"更好" 吗?
我不一定担心性能,我只是好奇为什么有些人选择TagBuilder而其他人使用格式化的字符串.
谢谢你的启示!
使用 TagBuilder 时,可以使用TagBuilder.Attributes.Add(..)
或TagBuilder. MergeAttribute(..)
向正在构建的 HTML 元素添加属性:
TagBuilder formBuilder = new TagBuilder("form");
formBuilder.Attributes.Add("method", "get");
formBuilder.Attributes.Add("action", url);
TagBuilder buttonBuilder = new TagBuilder("input");
buttonBuilder.MergeAttribute("type", "submit");
buttonBuilder.MergeAttribute("value", buttonText);
Run Code Online (Sandbox Code Playgroud)
但这两者有什么不同,我什么时候应该选择其中一种而不是另一种呢?
我有一个使用模型创建下拉列表的prtialview。在我的主视图中,我创建了partialview html字符串,以便稍后在javascript函数中使用它。
视图:
@model SomeViewModel
@{
var devicesDropDown = @Html.Partial("_DropDown", (SelectList)(Model.DeviceTypes));
var devicesHtmlDropDown = MvcHtmlString.Create(devicesDropDown.ToString());
}
Run Code Online (Sandbox Code Playgroud)
但是,当我想以这种方式在javascript中使用它时,它就像是导致javascript函数出错的未连接字符串。
js函数位于页面的底部:
<script type="text/javascript">
function format(d) {
var ddl = '@( devicesHtmlDropDown)';
return ddl;
}
</script>
Run Code Online (Sandbox Code Playgroud)
这是运行时字符串的样子:
var ddl = '<select class="form-control input" id="SelectedValue" name="SelectedValue" style="width: 100%">
<option selected="selected" value="456413">1</option>
<option value="564655465">2</option>
</select>
';
Run Code Online (Sandbox Code Playgroud)
我应该如何格式化此字符串以使其可以像静态html对象一样呈现。以及如何检索此下拉菜单的选定值以发布到操作?我应该使用TagBuilder吗?
javascript asp.net-mvc partial-views tagbuilder mvchtmlstring
所以我正在创建一个HtmlHelper扩展方法,并且在使用TagBuilder.SetInnerText()时遇到了问题.助手输出选项标签.这是助手的来源:
public static string Option(this HtmlHelper helper, string value, string text, object htmlAttributes) {
TagBuilder tagBuilder = new TagBuilder("option");
tagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
tagBuilder.MergeAttribute("value", value);
tagBuilder.SetInnerText(text);
return tagBuilder.ToString(TagRenderMode.SelfClosing);
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我打电话
<%= Html.Option("value", "text", new { }) %>
Run Code Online (Sandbox Code Playgroud)
但标签的内部文本没有设置,我留下了
<option value="value"> </option>
Run Code Online (Sandbox Code Playgroud)
关于为什么SetInnerText()没有正确设置文本的任何想法?
谢谢.
我希望在我自己的程序集中编写一些帮助程序,模仿System.web.mvc中的帮助程序.我的问题是我无法使用对Tagbuilder.ToMvcHtlString的调用,因为它是内部的.因此,如果我返回一个字符串,它就不会为asp.net 4做好准备.
我不想添加任何东西到system.web.mvc,因为这是一个给定的DLL.