0

私はMVC 4を初めて使用します。私のプロジェクトと同様に、さまざまな検証エラー番号とそれに対応する検証エラーメッセージを含む特別なファイルを用意する必要があります。次に、これらのエラー番号をモデルで定義し、そのような検証エラーを表示して、そのファイルから対応するエラーメッセージを取得し、検証の概要に表示するようにします。

[Remote]属性を使用して機能を実現する方法を見つけました。これが私がやった方法です。

モデル CUSTS.cs

namespace MvcTest.Models
{
    public partial class CUSTS
    {
        public Nullable<double> Field1 { get; set; }
        [Remote("ValidateAmount", "Validation", AdditionalFields = "Field1, Field2")]
        [Display(Name = "BALANCE AMT")]
        public Nullable<double> Field2 { get; set; }
    }
}

コントローラー ValidationController.cs

namespace MvcTest.Controllers
{
    public class ValidationController : Controller
    {
        Entities1 db = new Entities1();
        public static NameValueCollection messagesCol;
        public String errorField;
        public String errorMessage;

        public JsonResult ValidateAmount(CUSTS custs)
        {
            CUSTS cus = new CUSTS();

            if (custs.Field2< custs.Field1)
            {
                loadMessages();

                String[] errMsg = new String[1];
                errMsg = messagesCol.GetValues("OES0373");
                string st=errMsg[0] + ". \r\n The Balance amount is:" + custs.XWIDV0 + " & the Credit Limit is:" + custs.XWGIVA;
                return Json(st,JsonRequestBehavior.AllowGet);
                //return new ActionResult(errMsg[0] + ". \r\n The Balance amount is:" + custs.XWIDV0 + " & the Credit Limit is:" + custs.XWGIVA);
            }
            return Json(true, JsonRequestBehavior.AllowGet);
            //return ActionResult.Success;
        }

        public static void loadMessages()
        {
            StreamReader sr = new StreamReader(System.Web.HttpContext.Current.Server.MapPath("~\\Models\\messages_en.properties"));
            String fileContents = sr.ReadToEnd();

            String[] sepr = new string[] { "\r\n" };
            String[] lines = fileContents.Split(sepr, StringSplitOptions.RemoveEmptyEntries);

            messagesCol = new NameValueCollection();
            int numMessages = lines.Length;

            foreach (string line in lines)
            {
                int indx = line.IndexOf('=');

                if (indx != -1)
                {
                    messagesCol.Add(line.Substring(0, indx), line.Substring(indx + 1));
                }
            }

            sr.Close();
        }
    }
}

今、私は二つのことを聞きたいです

  1. 必要な機能を実現するこの方法は正しいですか。他に何ができるでしょうか。
  2. 私が診断したもう 1 つの問題は、有効かどうかに関係なく、ビュー内のフォームの post メソッドが検証に関係なく実行されていることです。
4

3 に答える 3

1

これが私がやった方法です:

1) DataAnnotationsModelValidatorProvider のカスタム実装で GetValidators() をオーバーライドします。ここで、ファイルを読み取り、対象のプロパティにアタッチするバリデータを決定できます。

2) 独自の ValidationAttributes を記述し、IsValid() メソッドをオーバーライドして、必要なカスタム ルールを実装します。また、FormatErrorMessage をオーバーライドして、エラー メッセージを任意の方法でフォーマットすることもできます。ValidationAttributes に IClientValidatable を実装することで、それらをクライアント側に伝達することもできます。

3) Global.asax の Application_Start() にプロバイダーを登録します。

ModelValidatorProviders.Providers.Add(new VProvider());

DataAnnotationsModelValidatorProvider のカスタム実装は次のようになります。

protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
     IEnumerable<ModelValidator> toRet = new Collection<ModelValidator>();
     string prop = metadata.PropertyName;
     //get the custom rules you want applied from database or file or any other storage 
     AddImplicitRequiredAttributeForValueTypes = false; //to remove implicit required from value types if you want to
     //Determine what attributes you want to apply to this property
     attributes = new List<Attribute>() { new MyCustomAttribute() };
     //Ask the base class to construct the list of validators to return to the caller
     return = base.GetValidators(metadata, context, attributes);
}

カスタム属性は次のようになります。

public class MyCustomAttribute:ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        //perform whatever tests you want here and return true/false
    }
    public override string FormatErrorMessage(string name)
    {
        //do some formatting
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var r = new ModelClientValidationRule
                    {
                       ErrorMessage = "Some error message",
                       ValidationType = "customType",
                    };
        r.ValidationParameters.Add(paramName,paramValue);

        yield return r;
    }

}
于 2012-09-07T06:49:44.657 に答える
0

エラー メッセージを含むリソース ファイルを使用する必要があるように思われます。次に、次のようなローカライズ用の組み込み属性パラメーターを使用します。

[Required(ErrorMessageResourceType=typeof(MyResourcesNameSpace.ResourcesFile),    
     ErrorMessageResourceName="FirstNameRequiredKey")]
于 2012-09-07T06:53:04.953 に答える
0

[Remote] 属性を使用して機能を実現する方法を見つけました。これが私がやった方法です。

モデル CUSTS.cs

namespace MvcTest.Models

{

public partial class CUSTS
{

    public Nullable<double> Field1{ get; set; }
    [Remote("ValidateAmount", "Validation", AdditionalFields = "Field1, Field2")]
    [Display(Name = "BALANCE AMT")]
    public Nullable<double> Field2{ get; set; }
}

}

コントローラー ValidationController.cs

namespace MvcTest.Controllers

{ public class ValidationController : Controller { Entities1 db = new Entities1(); public static NameValueCollection messagesCol; public String errorField; public String errorMessage;

    public JsonResult ValidateAmount(CUSTS custs)
    {
        CUSTS cus = new CUSTS();

        if (custs.Field2< custs.Field1)
        {
            loadMessages();

            String[] errMsg = new String[1];
            errMsg = messagesCol.GetValues("OES0373");
            string st=errMsg[0] + ". \r\n The Balance amount is:" + custs.XWIDV0 + " & the Credit Limit is:" + custs.XWGIVA;
            return Json(st,JsonRequestBehavior.AllowGet);
            //return new ActionResult(errMsg[0] + ". \r\n The Balance amount is:" + custs.XWIDV0 + " & the Credit Limit is:" + custs.XWGIVA);
        }
        return Json(true, JsonRequestBehavior.AllowGet);
        //return ActionResult.Success;
    }


    public static void loadMessages()
    {
        StreamReader sr =
            new StreamReader(System.Web.HttpContext.Current.Server.MapPath("~\\Models\\messages_en.properties"));
        String fileContents = sr.ReadToEnd();

        String[] sepr = new string[] { "\r\n" };
        String[] lines =
            fileContents.Split(sepr, StringSplitOptions.RemoveEmptyEntries);

        messagesCol = new NameValueCollection();
        int numMessages = lines.Length;

        foreach (string line in lines)
        {
            int indx = line.IndexOf('=');

            if (indx != -1)
            {
                messagesCol.Add(line.Substring(0, indx), line.Substring(indx + 1));
            }
        }

        sr.Close();
    }
}

}

ここで、2 つのことをお聞きしたいと思います。1. 必要な機能を実現するこの方法は正しいですか。他に何ができるでしょうか。2. 私が診断したもう 1 つの問題は、有効かどうかに関係なく、ビュー内のフォームの post メソッドが検証に関係なく実行されていることです。

于 2012-09-11T04:41:28.993 に答える