【问题标题】:ASP.NET MVC HtmlHelper extension method to wrap around only if it has contentASP.NET MVC HtmlHelper 扩展方法仅在它有内容时环绕
【发布时间】:2014-09-08 07:52:47
【问题描述】:

我正在制作一个可配置的表单——管理员选择显示哪些输入。输入由字段集包装。

我想制作一个 HtmlHelper 来生成只有当它有内容时的字段集——至少一个输入字段来防止这种情况

<fieldset id="Name">
   <legend>Name</legend>
   <input type="text" placeholer="Forename"></input>
   <input type="text" placeholer="Surname"></input>
</fieldset>


<fieldset id="Address">
   <legend>Address</legend>
</fieldset>

我们有类似地址的空字段集。

我已经做了一个 FieldSetHelper

public class FieldSetHelper: IDisposable
{
    private readonly HtmlHelper _htmlHelper;
    private readonly string _fieldSetId;
    private readonly string _legendId;
    private readonly string _legendText;

    public FieldSetHelper(HtmlHelper htmlHelper, string fieldSetId, string legendId, string legendText)
    {
        _htmlHelper = htmlHelper;
        _fieldSetId = fieldSetId;
        _legendId = legendId;
        _legendText = legendText;

        _htmlHelper.ViewContext.Writer = new StringWriter();

        OpenFieldSet();
        AddLegend();
    }

    private void OpenFieldSet()
    {
        string id = string.IsNullOrWhiteSpace(_fieldSetId) ? string.Empty : string.Format(" id=\"{0}\"", _fieldSetId);
        _htmlHelper.ViewContext.Writer.WriteLine(string.Format("<fieldset" + id + ">"));
    }

    private void CloseFieldSet()
    {
        _htmlHelper.ViewContext.Writer.WriteLine(string.Format("</fieldset>"));
    }

    private void AddLegend()
    {
        string id = string.IsNullOrWhiteSpace(_legendId) ? string.Empty : string.Format(" id=\"{0}\"", _legendId);
        _htmlHelper.ViewContext.Writer.WriteLine("<legend"+id+">");
        _htmlHelper.ViewContext.Writer.WriteLine(_legendText);
        _htmlHelper.ViewContext.Writer.WriteLine("</legend>");
    }

    public void Dispose()
    {
        CloseFieldSet();
    }

但是如果它的内容是空的,我不知道如何不生成它。 这是视图的一部分:

using (Html.BeginFieldSet("Address", null, "Address"))
{
   @Html.EditorFor(m => m.Address, new {Model.VisibleInputFields})
}

【问题讨论】:

    标签: asp.net-mvc html-helper


    【解决方案1】:

    我最近遇到了类似的情况。如果外部元素(从 using 元素生成的那个)没有任何项目,我试图添加一些“这里没有项目”文本。这是我最终所做的未经测试的修改版本,但如果您仍在寻找答案,它应该会让您接近。

     public class FieldSetHelper: IDisposable
    {
        private readonly HtmlHelper _htmlHelper;
        private readonly string _fieldSetId;
        private readonly string _legendId;
        private readonly string _legendText;
    
        public FieldSetHelper(HtmlHelper htmlHelper, string fieldSetId, string legendId, string legendText)
        {
            _htmlHelper = htmlHelper;
            _fieldSetId = fieldSetId;
            _legendId = legendId;
            _legendText = legendText;
    
            _htmlHelper.ViewContext.Writer = new StringWriter();
    
            OpenFieldSet();
            AddLegend();
        }
    
    
        private string BuildOpenFieldSetString(){
            string id = string.IsNullOrWhiteSpace(_fieldSetId) ? string.Empty : string.Format(" id=\"{0}\"", _fieldSetId);
            return string.Format("<fieldset" + id + ">");
        }
    
        private void OpenFieldSet()
        {
            _htmlHelper.ViewContext.Writer.WriteLine(BuildOpenFieldSetString());
        }
    
        private void CloseFieldSet()
        {
            _htmlHelper.ViewContext.Writer.WriteLine(string.Format("</fieldset>"));
        }
    
        private void AddLegend()
        {
            string id = string.IsNullOrWhiteSpace(_legendId) ? string.Empty : string.Format(" id=\"{0}\"", _legendId);
            _htmlHelper.ViewContext.Writer.WriteLine("<legend"+id+">");
            _htmlHelper.ViewContext.Writer.WriteLine(_legendText);
            _htmlHelper.ViewContext.Writer.WriteLine("</legend>");
        }
    
        public void Dispose()
        {
            var htmlString = _htmlHelper.ViewContext.Writer.ToString();
            var index = htmlString.Trim().LastIndexOf(BuildOpenFieldSetString().Trim());
            if(html.IndexOf("<input", index) == -1){
                _htmlHelper.ViewContext.Writer = new StringWriter();
                _htmlHelper.ViewContext.Writer.WriteLine(html.SubString(0,index));
            }else{
                CloseFieldSet();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多