加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 字段子集的验证摘要

发布时间:2020-12-16 03:54:32 所属栏目:asp.Net 来源:网络整理
导读:我有一个包含3个不同部分的表单,看起来像这样: form action="/Submit/" method="POST" h2 Your Info: /h2 ul li label First Name: @Html.TextBoxFor(m = m.FirstName) /label /li li label Last Name: @Html.TextBoxFor(m = m.LastName) /label /li /ul h2
我有一个包含3个不同部分的表单,看起来像这样:

<form action="/Submit/" method="POST">
    <h2>
        Your Info:
    </h2>
    <ul>
        <li>
            <label>
                First Name:
                @Html.TextBoxFor(m => m.FirstName)
            </label>
        </li>
        <li>
            <label>
                Last Name:
                @Html.TextBoxFor(m => m.LastName)
            </label>
        </li>
    </ul>
    <h2>
        Membership:
    </h2>
    <ul>
        <li>
            <label>@Html.RadioButtonFor(m => m.MembershipLength_Months,3) 3 Months</label>
        </li>
        <li>
            <label>@Html.RadioButtonFor(m => m.MembershipLength_Months,12) 12 Months</label>
        </li>
    </ul>
   <h2>
        Billing Info:
    </h2>
    @Html.EditorFor(m=> m.PaymentInfo)
    <input type="submit" value="Submit" />
</form>

我想做的是每个部分都有一个摘要.我知道我可以在每个H2下做这样的事情:

@if (ViewData.ModelState.Keys.Contains("FirstName") || ViewData.ModelState.Keys.Contains("LastName"))
{
    <div>
        summary text
        @Html.ValidationMessageFor(m => m.FirstName)
        @Html.ValidationMessageFor(m => m.LastName)
    </div>
}

但感觉应该有一个更清洁的解决方案. Google完全失败了,我无法找到自定义帮助程序或验证摘要扩展程序,它使用集合来表示要汇总的属性.

每个部分都包含大量字段,因此ModelState.Keys比较很快就会变得非常难看.有干净的方法吗?

解决方法

But it feels like there should be a cleaner solution.

是的,您可以编写一个自定义的,可重用的HTML帮助程序来完成此任务:

public static class HtmlExtensions
{
    public static IHtmlString Summary<TModel>(
        this HtmlHelper<TModel> html,params Expression<Func<TModel,object>>[] expressions
    )
    {
        var div = new TagBuilder("div");
        var sb = new StringBuilder();
        foreach (var expression in expressions)
        {
            var unary = expression.Body as UnaryExpression;
            if (unary != null && unary.NodeType == ExpressionType.Convert)
            {
                var lambda = Expression.Lambda(unary.Operand,expression.Parameters);                    
                sb.AppendLine(html.ValidationMessage(ExpressionHelper.GetExpressionText(lambda)).ToHtmlString());
            }
            else
            {
                sb.AppendLine(html.ValidationMessageFor(expression).ToHtmlString());
            }
        }
        div.InnerHtml = sb.ToString();
        return new HtmlString(div.ToString());
    }
}

可以像这样使用:

<h2>
    Your Info:
    @Html.Summary(
        x => x.FirstName,x => x.LastName
    )
</h2>

帮助程序允许您列出要包含在摘要中的任何属性作为验证错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读