如何在asp.net 5中为“asp-for”传递字符串值
我想为具有许多属性的实体编写Edit.cshtml文件,因此我必须多次编写以下代码:
实际上,有很多实体,所以我必须编写许多Edit.cshtml文件。 我想做一些简化
我想在控制器中选择实体的一些属性,并使用循环来显示视图中的属性。 例如:在控制器文件中:
public IActionResult Edit(string id) { var model = GetModel(id); var propertyNames= new List() { "Name", "Email" // add some other property names of the entity }; ViewData["PropertyList"] = propertyNames; return View(model); }
在视图文件中:
@{ var propertyNames = (List)ViewData["PropertyList"]; foreach (string item in propertyNames) { } }
但它无法工作,因为它会产生错误的代码。 似乎我无法为“asp-for”标签助手传递字符串值。
例如,如果我将top的代码更改为:
@{ string e = "Email"; }
上面的代码将生成:
预期的代码是:
我应该怎么做?
razor有可能吗?
好的,我设法让这个工作。 免责声明:这是超级hacky,我不知道我是否以最好的方式做到了。 我所知道的是,它做了你想要的,它可能会指向你正确的方向。
首先,我创建了一个模型:
using System.ComponentModel.DataAnnotations; namespace WebApplication1.Models { public class TestModel { [Required] public string Name { get; set; } [Required] [EmailAddress] [Display(Name = "Email Address")] public string Email { get; set; } } }
然后,我制作了一个自定义标签助手。 这是“神奇”发生的可怕部分。 特别是Process
方法的第一部分……
using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.ViewFeatures; using Microsoft.AspNet.Razor.TagHelpers; using System.Linq; namespace WebApplication1.TagHelpers { [HtmlTargetElement("edit")] public class EditTagHelper : TagHelper { [HtmlAttributeName("asp-for")] public ModelExpression aspFor { get; set; } [ViewContext] [HtmlAttributeNotBound] public ViewContext ViewContext { get; set; } protected IHtmlGenerator _generator { get; set; } public EditTagHelper(IHtmlGenerator generator) { _generator = generator; } public override void Process(TagHelperContext context, TagHelperOutput output) { var propName = aspFor.ModelExplorer.Model.ToString(); var modelExProp = aspFor.ModelExplorer.Container.Properties.Single(x => x.Metadata.PropertyName.Equals(propName)); var propValue = modelExProp.Model; var propEditFormatString = modelExProp.Metadata.EditFormatString; var label = _generator.GenerateLabel(ViewContext, aspFor.ModelExplorer, propName, propName, new { @class = "col-md-2 control-label", @type = "email" }); var input = _generator.GenerateTextBox(ViewContext, aspFor.ModelExplorer, propName, propValue, propEditFormatString, new { @class = "form-control" }); var validation = _generator.GenerateValidationMessage(ViewContext, aspFor.ModelExplorer, propName, string.Empty, string.Empty, new { @class = "text-danger" }); var inputParent = new TagBuilder("div"); inputParent.AddCssClass("col-md-10"); inputParent.InnerHtml.Append(input); inputParent.InnerHtml.Append(validation); var parent = new TagBuilder("div"); parent.AddCssClass("form-group"); parent.InnerHtml.Append(label); parent.InnerHtml.Append(inputParent); output.Content.SetContent(parent); base.Process(context, output); } } }
注意 :要使自定义TagHelper工作,您需要在_ViewImports.cshtml
文件中添加一行,如下所示(将WebApplication1
替换为您的命名空间):
@addTagHelper "*, WebApplication1"
我把我的动作改成了这个,以便与你匹配(也许你可以使用reflection来获取你的模型属性名称?):
public IActionResult Index() { var propertyNames = new List() { "Name", "Email" }; ViewData["PropertyList"] = propertyNames; var m = new TestModel() { Name = "huoshan12345", Email = "test@test.net" }; return View(m); }
最后,在视图中,您可以执行以下操作:
@using (Html.BeginForm()) { var propertyNames = (List)ViewData["PropertyList"]; foreach (string item in propertyNames) { } }
是的,可以用razor写它。 认为这会对你有所帮助。 如果你没有输入“type”属性,它将使用type='text'
生成它。 您也可以对data-val属性进行硬编码,但建议不要将’ – ‘替换为’ @data_val_email
: @data_val_email
@Html.LabelFor(x=>x.Email) @Html.TextBoxFor(x => x.Email, new { @class = "form-control", @type = "email" }) @Html.ValidateFor(x=>x.Email)