我正在尝试在MVC 6中创建自定义标记帮助程序,但无法使其工作.
这是我在Web应用程序项目中定义的演示标记助手类.
namespace Microsoft.AspNet.Mvc.TagHelpers
{
[TargetElement("demo", Attributes = CustomAttributeName)]
public class DemoTagHelper : TagHelper
{
private const string CustomAttributeName = "asp-custom";
[HtmlAttributeName(CustomAttributeName)]
public string Custom { get; set; }
public string Value { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";
output.Attributes["foo"] = "bar";
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在我的观点中使用它的方式:
<demo asp-custom="hello world!">
Please work this time :)
</demo>
Run Code Online (Sandbox Code Playgroud)
我尝试了很多东西.删除了TargetElement
属性或更改了命名空间.没有什么变化......结果仍然相同.
顺便说一句,我的Microsoft.AspNet.Mvc.TagHelpers版本是6.0.0-beta4.
也许我必须在某个地方注册我的标签助手?我查看了MVC源代码,他们没有在任何地方引用自己的标记助手.所以我认为不需要注册.
这里的问题在哪里?
我试图抓住当前路线,以便我可以使用Tag Helper突出显示一组链接中的活动页面.
TagHelperContext不允许我访问任何有用的东西.如何获取RouteData的引用?
我想为具有许多属性的实体编写Edit.cshtml文件,因此我必须多次编写以下代码:
<div class="form-group">
<label asp-for="Email" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
实际上,有很多实体,所以我必须编写许多Edit.cshtml文件.我想做一些简化
我想在控制器中选择实体的一些属性,并使用循环来显示视图中的属性.例如:在控制器文件中:
public IActionResult Edit(string id)
{
var model = GetModel(id);
var propertyNames= new List<string>()
{
"Name",
"Email"
// add some other property names of the entity
};
ViewData["PropertyList"] = propertyNames;
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
在视图文件中:
@{
var propertyNames = (List<string>)ViewData["PropertyList"];
foreach (string item in propertyNames)
{
<div class="form-group">
<label asp-for="@(item)" class="col-md-2 control-label"></label>
<div class="col-md-3">
<input asp-for="@(item)" class="form-control" />
<span asp-validation-for="@(item)" class="text-danger"></span>
</div> …
Run Code Online (Sandbox Code Playgroud) 问题出在标题中.对每个图像使用此标记助手似乎是合乎逻辑的,但如果我确实认为为什么这不是默认值?
这有什么性能影响吗?有没有我不应该用这个标签助手装饰图像的情况?
我在 ASP.NET MVC 6 中使用新的 Helper 标签。
<form asp-area="DAS"
asp-controller="Report"
asp-action="Add"
asp-route-id="@Model.id"
asp-route-incBalance="@Model.incBalance"
asp-route-dateSet="@Model.dataStart.ToString("yyyy-MM-dd")"
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
method="post" role="form">
</form>
Run Code Online (Sandbox Code Playgroud)
我想路由属性:
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
Run Code Online (Sandbox Code Playgroud)
仅适用于:
{
if (Model.incBalance == 0)
{
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
}
}
Run Code Online (Sandbox Code Playgroud)
结果,我想得到这样的东西:
<form asp-area="DAS"
asp-controller="Report"
asp-action="Add"
asp-route-id="@Model.id"
asp-route-incBalance="@Model.incBalance"
asp-route-dateSet="@Model.dataStart.ToString("yyyy-MM-dd")"
{
if (Model.incBalance == 0)
{
asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
}
}
method="post" role="form">
</form>
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
TagHelper 属性必须格式良好。
Run Code Online (Sandbox Code Playgroud)if (Model.incBalance == 0)
和
标签助手“表单”在元素的属性声明区域中不得包含 C#。
Run Code Online (Sandbox Code Playgroud)asp-route-dateNext="@Model.dataEnd.ToString("yyyy-MM-dd")"
我正在使用 Visual Studio 2015 更新 1
更新 1: 我也试过这个选项:
@(Model.incBalance == 0 ? "asp-route-dateNext=" + Model.dataEnd.ToString("yyyy-MM-dd") : string.Empty)
Run Code Online (Sandbox Code Playgroud)
但错误仍然存在: …
c# asp.net-core-mvc tag-helpers asp.net-core asp.net-core-1.0
我想知道 .NET core 的 asp-validation-for 是否有一种方法可以覆盖在跨度上设置的类,或者是否有一种方法可以扩展标签帮助器以允许这样做。现在,当客户端发生错误时,field-validation-error
是放在我的 span 元素上的类。我想知道是否有办法在 .NET Core 中覆盖它,或者我是否必须自己开发/修改它?这似乎是一个愚蠢的缺点,如果没有其他方法来获得我正在寻找的东西,我会感到惊讶。
问题是我正在使用引导程序,当表单未通过验证时,我想向我的错误元素添加一些引导程序类。
在Asp.Net MVC中,我们可以有条件地添加类,如下代码:
<div class="choice @(Model.Active?"active":"")">
</div>
Run Code Online (Sandbox Code Playgroud)
如何通过使用tagHelper和删除条件中的其他部分来做到这一点.
我试图在html结果中向锚点添加请求查询中的任何内容:
虚构的例子:
用户发出请求(请注意,乐队和歌曲可以是任何内容,我有一条路径来满足此请求:模板:"{band}/{song}"):
http://mydomain/band/song?Param1=111&Param2=222
Run Code Online (Sandbox Code Playgroud)
现在我希望我的锚点将查询字符串部分附加到我的锚点的href.所以我试过这样的事情(注意'asp-all-route-data'):
<a asp-controller="topic" asp-action="topic" asp-route-band="iron-maiden" asp-route-song="run-to-the-hills" asp-all-route-data="@Context.Request.Query.ToDictionary(d=>d.Key,d=>d.Value.ToString())">Iron Maiden - Run to the hills</a>
Run Code Online (Sandbox Code Playgroud)
查询字符串的附加实际上与上面的代码一起使用,但随后结果中丢失了"铁娘子"和"跑到山上".上面的标签助手返回以下内容(注意帮助器如何将请求中的乐队和歌曲镜像到href中,而不是我在asp-route属性中指定的乐队和歌曲):
<a href="http://mydomain/band/song?Param1=111&Param2=2222">Iron Maiden - Run to the hills</a>
Run Code Online (Sandbox Code Playgroud)
我希望帮助者得到以下结果:
<a href="http://mydomain/iron-maiden/run-to-the-hills?Param1=111&Param2=2222">Iron Maiden - Run to the hills</a>
Run Code Online (Sandbox Code Playgroud)
看起来当我使用asp-all-route-data时,我在结果中丢失了asp-route-band和asp-route-song值.
有没有人偶然发现了这个?
谢谢
Hooroo
asp.net asp.net-mvc tag-helpers asp.net-core asp.net-core-tag-helpers
我正在学习 Razor Pages 标签帮助程序并尝试了解部分标签帮助程序的工作原理。我注意到可以使用两个不同的属性将数据传递到部分:for
和model
。
for
:“for 属性指定要针对当前模型进行评估的 ModelExpression。”
model
:“模型属性分配一个模型实例以传递给分部视图。”
我很难理解这种差异。模型是否只是期望模型的实例,而for
期望属性?谁能帮我把这个分解一下吗?
我创建了一个继承自 InputTagHelper 的标签助手,如这篇文章/sf/answers/2834275811/中的答案所示。
这是代码
[HtmlTargetElement("input", Attributes = ForAttributeName)]
public class ExrInputTagHelper : InputTagHelper
{
private const string ForAttributeName = "asp-for";
[HtmlAttributeName("asp-disabled")]
public bool IsDisabled { get; set; }
public ExrInputTagHelper(IHtmlGenerator generator):base(generator)
{
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
if (IsDisabled)
{
var d = new TagHelperAttribute("disabled", "disabled");
output.Attributes.Add(d);
}
base.Process(context, output);
}
}
Run Code Online (Sandbox Code Playgroud)
这是它的用法:
<input asp-for="UsingCreditCard" type="checkbox" asp-disabled="@Model.UsingACH" />
Run Code Online (Sandbox Code Playgroud)
这很有效,但有一个明显的问题。如果输入类型是复选框,则会呈现两次。所有其他输入类型都很好用。为什么会出现这种情况呢?
<input checked="checked" data-val="true" data-val-required="The UsingCreditCard field is required." id="UsingCreditCard" name="UsingCreditCard" type="checkbox" value="true">
<input checked="checked" id="UsingCreditCard" name="UsingCreditCard" …
Run Code Online (Sandbox Code Playgroud) tag-helpers ×10
asp.net-core ×7
c# ×5
asp.net ×4
asp.net-mvc ×3
css ×1
jquery ×1
razor ×1
razor-pages ×1
views ×1