MVC 6引入了Tag Helpers作为@ Html.EditorFor的更好替代品.可以创建自定义编辑器模板.也可以创建自定义Tag Helper.
但是,在创建Tag Helper时,需要通过C#代码(使用TagBuilder等)创建HTML.对于复杂的Tag Helpers,它不如使用Razor语法那么方便.
有没有什么方法可以让我从Razor页面创建自定义Tag Helper?
是否应该asp-在Razor/MVC 6中为新标签助手提供Intellisense ?我正在关注Shawn Wildermuth的一个关于Pluralsight的课程并且一切正常,但我认为当我开始asp-在标签上作为属性打字时我应该得到智能感知.
如果它应该在那里你有什么可能导致它消失的想法?
我正在使用Visual Studio 2015社区,以及针对Kestrel,Mvc和TagHelpers的.Net依赖项的RC1-Final版本.
在ASP.NET核心视图中,我有以下内容:
<div class="message" message=""></div>
Run Code Online (Sandbox Code Playgroud)
我是一个带有以下TagHelper的Tag Helper:
[HtmlTargetElement("div", Attributes = MessageName)]
public class MessageTagHelper : TagHelper {
private const String MessageName = "message";
[HtmlAttributeName(MessageName)]
public String Message { get; set; }
[HtmlAttributeNotBound, ViewContext]
public ViewContext ViewContext { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output) {
String message;
Boolean defined = ViewContext.HttpContext.Request.Cookies.TryGetValue("_message", out message);
if (defined) {
ViewContext.HttpContext.Response.Cookies.Delete("_message");
output.Attributes.Add("class", "active");
output.Content.Append(message);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在下面的代码行中,我需要将"active"添加为CSS Class.
output.Attributes.Add("class", "active");
Run Code Online (Sandbox Code Playgroud)
但是,这没有任何作用.消息仅保留在类"消息"中.
我错过了什么?
我对TagHelper在ASP.NET Core MVC 中引入的行为感到困惑.按照本教程一个有效的电子邮件Tag Helper,我们有机会编写自动关闭标签.根据这篇文章,我们应该使用attbute HtmlTargetElement.下面的类是示例:
[HtmlTargetElement("email", TagStructure = TagStructure.WithoutEndTag)]
public class EmailTagHelper : TagHelper
{
private const string EmailDomain = "contoso.com";
public string MailTo { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a";
var address = MailTo + "@" + EmailDomain;
output.Attributes.SetAttribute("href", "mailto:" + address);
output.Content.SetContent(address);
}
}
Run Code Online (Sandbox Code Playgroud)
剃刀视图中的标记如:
<strong>Support:</strong>
<email mail-to="Support"/><br />
<strong>Marketing:</strong>
<email mail-to="Marketing"/>
Run Code Online (Sandbox Code Playgroud)
但我有意想不到的输出:
<strong>Support:</strong>
<a href="mailto:Support@contoso.com">
<span>Another content</span>
<strong>Marketing:</strong>
</a>
<a href="mailto:Marketing@contoso.com"></a>
Run Code Online (Sandbox Code Playgroud)
为什么第一个锚标记包含<span> …
ASP.NET Core TagHelper文档提供了以下示例:
public class WebsiteContext
{
public Version Version { get; set; }
public int CopyrightYear { get; set; }
public bool Approved { get; set; }
public int TagsToShow { get; set; }
}
[TargetElement("website-information")]
public class WebsiteInformationTagHelper : TagHelper
{
public WebsiteContext Info { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "section";
output.Content.SetContent(
$@"<ul><li><strong>Version:</strong> {Info.Version}</li>
<li><strong>Copyright Year:</strong> {Info.CopyrightYear}</li>
<li><strong>Approved:</strong> {Info.Approved}</li>
<li><strong>Number of tags to show:</strong> {Info.TagsToShow}</li></ul>");
output.TagMode = TagMode.StartTagAndEndTag;
} …Run Code Online (Sandbox Code Playgroud) 抱歉,我的大多数搜索都会将我带到旧的MVC代码.任何帮助将不胜感激.
在带有标记帮助器的MVC 6中,如何编写一组复选框:
?
我能够正确显示带有标签的复选框,但我不知道如何通过模型将选中的值传递回控制器.现在,IsOptionSelected值返回false.
我还能够为标签工作制作html帮助器,但不能为标签帮助器制作.我可能也编码这些都错了所以任何提示都会有所帮助!
这是我到目前为止所拥有的:
显示:
实体:
public class PhoneOption
{
public bool IsOptionSelected { get; set; } = false;
public int OptionId { get; set; }
public string OptionName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
模型:
[Display(Name = "Phone Options")]
public IEnumerable<PhoneOption> PhoneOptions { get; set; }
. . . .
PhoneOptions = repository.GetPhoneOptions();
Run Code Online (Sandbox Code Playgroud)
库:
public IEnumerable<PhoneOption> GetPhoneOptions()
{
IEnumerable<PhoneOption> options = new[]
{
new PhoneOption { OptionId = 1, OptionName = "Phone Case", IsOptionSelected …Run Code Online (Sandbox Code Playgroud) 如何将元素定义为TagHelper内容?
例如,元素定义为:
<markdown>bla bla</markdown>
Run Code Online (Sandbox Code Playgroud)
和助手定义为:
[HtmlTargetElement("markdown")]
public class MarkdownTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var c = output.Content.GetContent();
// c is empty; how to get content "bla bla"?
}
}
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试在asp.net 5中使用taghelpers.我想使用带有ViewBag列表的select标签帮助器.我放入asp-for字段的任何内容都会给我一个错误,因为它试图从IEnumerable而不是视图包中取出它.
我想替换这个:
@model IEnumerable<InvoiceIT.Models.Invoice>
@using (Html.BeginForm())
{
<p>
@Html.DropDownList("Companies", String.Empty)
<input type="submit" value="Filter" class="btn btn-default" />
</p>
}
Run Code Online (Sandbox Code Playgroud)
有了这个:
@model IEnumerable<InvoiceIT.Models.Invoice>
<form asp-controller="Invoice" asp-action="Index" method="post" class="form-horizontal" role="form">
<select asp-for="????" asp-items="ViewBag.Companies" class="form-control">
</select>
<input type="submit" value="Save" class="btn btn-default" />
</form>
Run Code Online (Sandbox Code Playgroud)
以下是我如何填充控制器中的选择列表:
ViewBag.Companies = new SelectList(await DbContext.Company.ToListAsync(), "CompanyID", "Name");
Run Code Online (Sandbox Code Playgroud) 我有一个简单的ASP.NET Core Web应用程序,其中包含这样的页面http://localhost:5050/Posts/Create/3.
在我的Razor View中Views/Posts/Create.cshtml,我如何能够获得值"3"以便我可以创建类似的链接<a href="/Blogs/Details/3">« Back to Blog</a>?
到目前为止,使用以下Tag Helper创建了链接,但我不知道要放什么asp-route-id:
<a asp-controller="Blogs" asp-action="Details" asp-route-id="" class="btn btn-default btn pull-right">« Back</a>
Run Code Online (Sandbox Code Playgroud)
我只是使用默认的mvc路由:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
Run Code Online (Sandbox Code Playgroud)
我知道我可以从模型(即,得到它Model.Blog.BlogId),但我希望从URL得到它使用类似Request.Query["id"]在Views/Post/Create.cshtml.
我试过了asp-route-id="@Context.Request.Query["id"].
我正在处理ASPNET CORE [版本1.1,使用VS2017社区,版本15.1(26403.3)]我创建了一个工作的ViewComponent UserDetails(缩写如下):
namespace AdminConsole.ViewComponents
{
[ViewComponent(Name = "UserDetails")]
public class UserDetailsViewComponent : ViewComponent
{ ...does stuff... }
Run Code Online (Sandbox Code Playgroud)
我可以通过使用在视图中成功调用它
@await Component.InvokeAsync("UserDetails")
Run Code Online (Sandbox Code Playgroud)
我宁愿通过使用TagHelper调用它,但它只是没有发生.我已经浏览了SO和其他有用的页面,而其他人似乎让它工作,我不能.
我@addTagHelper "*, AdminConsole"在_ViewImports.cshtml中添加了一行,<vc:user-details></vc:user-details>在视图中我想要渲染VC,它不会渲染; 我没有得到错误,它只是没有渲染.
如果我将TagHelper声明更改为@addTagHelper *, AdminConsole(没有语音标记),它也不会呈现或出错.
如果我尝试上述两种组合并尝试<vc:UserDetails></vc:UserDetails>没有烤肉串的情况下,它不会渲染或错误.
我的_ViewImports.cshtml情况如下
@using AdminConsole
@using AdminConsole.Models
@using AdminConsole.Models.AccountViewModels
@using AdminConsole.Models.ManageViewModels
@using Microsoft.AspNetCore.Identity
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@inject Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration TelemetryConfiguration
@addTagHelper "*, AdminConsole"
Run Code Online (Sandbox Code Playgroud)
在@addTagHelperdeclaration(AdminConsole.ViewComponents)中使用VC的完整命名空间会产生cannot resolve TagHelper错误.
我想我已经尝试了所有的排列,来自官方和社区来源的文档只是建议我尝试过(并且有所不同!).如果有人能帮助我解释一下,我将非常感激.