Как получить истинный или ложный вывод для проверки модели MVC3

#c# #asp.net-mvc-3

#c# #asp.net-mvc-3

Вопрос:

Я использую форму для публикации информации, и в мою модель встроена проверка. Я знаю, что могу проверить поля, используя любое из следующих действий:

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

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

Оба этих метода просто возвращают список HTML (для ValidationSummary) или диапазон (ValidateionMessageFor).

Что я хотел бы сделать, так это просто получить оператор true или false, если поле допустимо или нет (или 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>
 

Ответ №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>
}
 

Комментарии:

1. Это потрясающе, большое спасибо. Буду использовать это совсем немного. Жаль, что в него еще не встроена такая функция :/

2. @JakeJ, пожалуйста, прочтите следующее сообщение в блоге, чтобы понять, почему есть некоторые функции, которые вы, возможно, хотели бы видеть встроенными, но их нет: blogs.msdn.com/b/ericlippert/archive/2003/10/28/53298.aspx

3. Спасибо за это, на самом деле это очень интересная статья. Хотя это немного больше, чем одноразовая вещь, которая будет использоваться, это то, что мне всегда было интересно и хотелось использовать, но вместо этого приходилось искать обходные пути, поскольку я довольно много работаю с формами. Но в любом случае, этот фрагмент сэкономит мне кучу времени в будущем, еще раз спасибо.