如何在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)