【问题标题】:How to get a True or False output for MVC3 Model Validation如何获得 MVC3 模型验证的真假输出
【发布时间】:2011-10-28 21:10:07
【问题描述】:

我正在使用表单发布信息,并且我的模型已内置验证。我知道我可以使用以下任一方法来验证字段:

@Html.ValidationSummary() //To validate all fields

@Html.ValidationMessageFor(x => x.FirstName) //To validate single field

这两种方法都只返回一个 HTML 列表(For ValidationSummary)或一个跨度(ValidateionMessageFor)。

我想要做的只是得到一个正确或错误的声明,如果该字段有效或无效(如果没有,则为 null),以便我可以对包含输入的框甚至标签进行一些自定义样式为它。

有谁知道是否有这样的代码可以做到这一点,比如@Html.IsValid(x => x.FirstName)

这是我的模型和视图。该模型正在通过并正确验证,这只是我是否可以获得布尔值而不是 HTML 字符串的问题。

型号:

using System.ComponentModel.DataAnnotations;

namespace X.Web.Helpers
{
    public class RequestSamplesModel
    {
        [Required]
        public string FirstName { get; set; }
        [Required]
        public string LastName { get; set; }

        public string Email { get; set; }
        [Required]
        public string Line1 { get; set; }
        [Required]
        public string Line2 { get; set; }
        [Required]
        public string City { get; set; }
        [Required]
        public string Postcode { get; set; }
        [Required]
        public string Country { get; set; }
    }
}

查看:

@{
    Layout = "~/Views/Shared/_PlainLayout.cshtml";
}
@using X.Web.Helpers
@model RequestSamplesModel

<form action="/Site/RequestSamples" method="POST">
    <div class="form-item">
        <span>First Name:</span>@Html.TextBoxFor(x => x.FirstName)</div>
    <div class="form-item">
        <span>Last Name:</span>@Html.TextBoxFor(x => x.LastName)</div>
    <div class="form-item">
        <span>Email:</span>@Html.TextBoxFor(x => x.Email)</div>
    <div class="form-item">
        <span>Address 1:</span>@Html.TextBoxFor(x => x.Line1)</div>
    <div class="form-item">
        <span>Address 2:</span>@Html.TextBoxFor(x => x.Line2)</div>
    <div class="form-item">
        <span>City:</span>@Html.TextBoxFor(x => x.City)</div>
    <div class="form-item">
        <span>Postcode:</span>@Html.TextBoxFor(x => x.Postcode)</div>
    <div class="form-item">
        <span>Country:</span>@Html.TextBoxFor(x => x.Country)</div>
    <div class="form-item">
        <input class="submit-button" type="image" src="/_content/images/email-submit.gif" /></div>
</form>

【问题讨论】:

    标签: c# asp.net-mvc-3


    【解决方案1】:

    有谁知道是否有这样的代码可以做到这一点,比如 @Html.IsValid(x => x.FirstName)

    不,没有内置这样的代码。但是写一个这样就很简单了:

    public static class HtmlExtensions
    {
        public static bool IsValid<TModel, TProperty>(
            this HtmlHelper<TModel> htmlHelper, 
            Expression<Func<TModel, TProperty>> expression
        )
        {
            var modelState = htmlHelper.ViewData.ModelState;
            var name = ExpressionHelper.GetExpressionText(expression);
            var key = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
            ModelState value;
            return !modelState.TryGetValue(key, out value) || 
                   value.Errors.Count == 0;
        }
    }
    

    现在在您看来,只需将扩展方法纳入范围,然后:

    @if (Html.IsValid(x => x.FirstName))
    {
        @:<div>Super, the first name is valid</div>
    }
    

    【讨论】:

    • 太棒了,非常感谢。将使用这个相当多。可惜还没有内置这种功能:/
    • @JakeJ,请阅读以下博客文章以了解为什么有些功能您可能希望看到内置但它们不是:blogs.msdn.com/b/ericlippert/archive/2003/10/28/53298.aspx
    • 感谢您,这实际上是一篇非常有趣的文章。虽然这不仅仅是一次性使用的东西,但它是我一直想知道和想要使用的东西,但由于我经常使用表单而不得不做出变通方法。但不管怎样,这个 sn-p 会在以后为我节省很多时间,再次感谢。
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多