2011-10-28 17 views
0

私は情報を投稿するためにフォームを使用しており、モデルには検証が組み込まれています。私は、次のいずれかを使用してフィールドを検証することができます知っている:MVC3モデル検証用に真または偽の出力を得る方法

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

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

これらのメソッドの両方がちょうど(にValidationSummary用)HTMLリストまたはスパン(ValidateionMessageFor)を返します。

入力が含まれているボックスにカスタムスタイリングを行うことができるように、フィールドが有効かどうか(または何もない場合はnull)、真または偽の文を取得するだけです。それのラベル。ここで@Html.IsValid(x => x.FirstName)

私のモデルとビューがあるように、これを行いますこのようなコードがある場合

は誰もが知っています。モデルが引き抜かれ、正しく検証されているかどうかは、HTML文字列ではなくブール値を取得できるかどうかという問題です。

MODEL:

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; } 
    } 
} 

VIEW:

@{ 
    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> 

答えて

3
@ Html.IsValidのように、これを行いますこのようなコードがある場合

は誰もが知っている(X => x.FirstName)

いいえ、このようなコードは組み込まれていません。しかし、今そこにあるように1を書くこと些細なことになります。あなたの意見で

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> 
} 
+0

、おかげでたくさん。これをかなり使っています。まだその種の機能が組み込まれていないのを恥ずかしく思っています。/ – JakeJ

+0

@JakeJ、以下のブログの記事を読んで、組み込みのものがあるかもしれないが、そうではない機能がいくつあるのか理解してください。 blogs.msdn.com/b/ericlippert/archive/2003/10/28/53298.aspx –

+0

本当に面白い記事です。これは使用される単なるものより少しですが、これは私がいつも不思議と思っていたが、代わりに回避策を講じなければならないものです。しかしどちらの方法でも、このスニペットは私に将来の束を救うでしょう、おかげさまで再び。 – JakeJ

関連する問題