我想为具有许多属性的实体编写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";}
上面的代码将生成:
预期的代码是:
我应该怎么做?
剃须刀有可能吗?
好的,我设法让这个工作.免责声明:这是超级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"
我把我的动作更改为了这个,以便与你匹配(也许你可以使用反射来获取你的模型属性名称?):
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) { } }