当前位置:  开发笔记 > 编程语言 > 正文

如何在asp.net 5中为"asp-for"传递字符串值

如何解决《如何在asp.net5中为"asp-for"传递字符串值》经验,为你挑选了1个好方法。

我想为具有许多属性的实体编写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";
    
}

上面的代码将生成:

预期的代码是:

我应该怎么做?

剃须刀有可能吗?



1> Jamie Dunsta..:

好的,我设法让这个工作.免责声明:这是超级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) { } }


哇。非常感谢你。实际上,您还回答了另一个有关taghelper的问题,这使我感到困惑。---- http://stackoverflow.com/questions/33649181/how-to-write-a-custom-asp-net-5-taghelper-that-c​​ontains-other-taghelpers
推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有