ASP.NET Core引入了自定义标记帮助程序,可以在以下视图中使用:
sleep 1
但是,我不明白如何在我的课程中获取模型属性名称:
<country-select value="CountryCode" />
在之前的版本中,我可以使用public class CountrySelectTagHelper : TagHelper
{
[HtmlAttributeName("value")]
public string Value { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
...
// Should return property name, which is "CountryCode" in the above example
var propertyName = ???();
base.Process(context, output);
}
}
:
ModelMetadata
如何在新的var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var property = metadata.PropertyName; // return "CountryCode"
代码帮助程序中执行相同操作?
答案 0 :(得分:4)
要获取媒体资源名称,您应该在班级中使用ModelExpression
:
public class CountrySelectTagHelper : TagHelper
{
public ModelExpression For { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var propertyName = For.Metadata.PropertyName;
var value = For.Model as string;
...
base.Process(context, output);
}
}
答案 1 :(得分:1)
您可以通过标记帮助程序属性传递字符串。
<country-select value="@Model.CountryCode" />
Value
属性将由Razor填充,其值为Model.CountryCode
,前缀为@
。因此,您可以直接获取值,而无需传递模型属性的名称并在之后访问它。
答案 2 :(得分:0)
我不确定你是否得到了你想要的东西。如果您希望将完整模型从视图传递到自定义标记帮助器,我就是这样做的。
您可以使用任何自定义属性从视图传入当前模型。请参阅下面的示例。
假设您的模型为Country
public class Country
{
public string Name { get; set; }
public string Code { get; set; }
}
现在在相同类型的自定义标记帮助器中声明一个属性。
public Country CountryModel { get; set; }
您的控制器看起来像这样
public IActionResult Index()
{
var country= new Country
{
Name = "United States",
Code = "USA"
};
return View("Generic", country);
}
在此设置中,要访问taghelper中的模型,只需将其传递给任何其他自定义属性/属性
您的视图现在应该像这样
<country-select country-model="@Model"></country-select>
您可以像任何其他类属性一样在标记助手中接收它
public override void Process(TagHelperContext context, TagHelperOutput output)
{
...
// Should return property name, which is "CountryCode" in the above example
var propertyName = CountryModel.Name;
base.Process(context, output);
}
快乐的编码!