c#web APIのコントローラアクションメソッドに渡されたモデルでカスタム検証メッセージを作成するにはどうすればよいですか?ここでコントローラに渡されたモデルでカスタム検証メッセージを作成するにはどうすればいいですか?c#web api
は、モデルである:ここでは
[DataContract]
public class TestDto //: IValidatableObject
{
[DataMember]
[LongValidation("Its not a long!")]
public long? ID { get; set; }
[DataMember]
public string Description { get; set; }
public string DescriptionHidden { get; set; }
}
は私のコントローラクラスである:
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public string Post([FromBody]TestDto testDto)
{
//todo: should a post return any data?
if (ModelState.IsValid)
return "success!";
else
{
var ret = string.Empty;
foreach (var modelState in ModelState)
{
ModelErrorCollection errorCollection = modelState.Value.Errors;
var errors = string.Empty;
foreach (var error in errorCollection)
{
errors = errors + "exception message: " + error.Exception.Message + ", errorMessage: " + error.ErrorMessage;
}
ret = ret + "Error: " + modelState.Key + ", " + modelState.Value.Value + ", errors: " + errors;
}
return ret;
}
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
私はポストの行動にこのオブジェクトを投稿する場合:私のLongValidationの有効で
{
"ID" : "1aaa","Description": "sample string 2",
}
メソッドでは、私は長いうちのデフォルト値を取得しない: "1aaa"、私はvalidaで正しい検証を実行することはできませんトルーマンここで
はロング検証のためのコードです:
public class LongValidationAttribute : ValidationAttribute
{
public LongValidationAttribute(string errorMessage) : base(errorMessage)
{
}
public override string FormatErrorMessage(string name)
{
return base.FormatErrorMessage(name);
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
long ret;
bool success = long.TryParse(value.ToString(), out ret);
//return base.IsValid(value, validationContext);
if (success == false)
return new ValidationResult(this.ErrorMessage);
else
{
return ValidationResult.Success;
}
}
}
ありがとうございました。指定されたコンテキストで適切な方法でshow-casingを実行していただきありがとうございます。指定されたコードスニペットはasp.netコアで動作します。私は以下の答えでコードをリファクタリングして、人々がmvc4 +で同じ機能を達成するのに苦労するのを助けました。再度、感謝します。 – xDisruptor