【问题标题】:C# / MVC Validate model data and call external API based on the resultsC# / MVC 验证模型数据并根据结果调用外部 API
【发布时间】:2016-11-03 18:41:52
【问题描述】:

我创建了一个 WebAPI Web 应用程序,我想在 POST 时验证数据,并根据结果调用外部 API。 除验证结果外,数据将按原样保存在数据库中。 仅对调用外部 API 进行验证。
我已经创建了发布到外部 API 的逻辑,但我不太确定这将是验证数据的最佳方式。

我的模型包括 10 个类,如下面的 Class1 具有多个属性,我为每个类创建了一个控制器。 属性可以具有真/假值,但作为字符串。

public class Class1
{
    public ICollection<Class1Data> Data { get; set; }
}

public class Class1Data
{
    public int Id { get; set; }
    public string Prop1{ get; set; }
    public string Prop2 { get; set; }
    ..
    public string Prop10 { get; set; }
}

用于 POST 的 WebAPI 控制器:

[ResponseType(typeof(Class1))]
public async Task<IHttpActionResult> PostClass1(Class1 class1)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    db.Class1.Add(class1);
    await db.SaveChangesAsync();

    return CreatedAtRoute("DefaultApi", new { id = Class1.Id }, class1);
}

我设法以某种方式验证一个属性并 POST 到外部 API,但不太确定如何为我的所有模型类做到这一点(每个模型类大约有 10、20 个道具)。

var notValid = Class1.Data.Where(x => x.Prop1 == "False");

if (notValid != null)
{
    foreach ( var fault in notValid )
    {
        // Call external API using fault.Prop1 / fault.Prop5 / ..
    }    
}

我怎样才能做到这一点? 我希望我的问题对你有意义。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    最简单的方法是使用数据注解:

    例子:

    [StringLength(100)]
    public string AccountKey { get; set; }
    
    [Required]
    [StringLength(100)]
    public string FirstName { get; set; }
    

    或者,如果您需要自定义验证,您可以将它们定义为自定义验证属性并像下面这样使用它们:

    [Required]
    [CountryCode]
    [StringLength(3)]
    public string CountryCode { get; set; }
    

    在此示例中,[CountryCode] 是一个自定义验证,您可以这样实现:

    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter)]
    public class CountryCodeAttribute : RegularExpressionAttribute
    {
        public CountryCodeAttribute() :
            base("^[A-z]{2,3}([-]{1}[A-z]{2,})?([-]?[A-z]{2})?$")
        {
            ErrorMessage = "Invalid country code.";
        }
    }
    

    您需要导入此命名空间以进行此类验证:

    System.ComponentModel.DataAnnotations
    

    【讨论】:

    • 我正在考虑这种方法,但有一些问题:如果一个属性的验证测试失败(即使我抛出错误消息),数据控制器是否仍会继续向数据库添加数据?如何将属性名称(来自模型)和值传递给外部 API(在自定义验证类中)。
    • 我已经成功地在实现 IValidatableObject 接口的模型中验证了我的模型,并且它确实在工作。感谢您的意见。现在我唯一的问题是我试图在 Validate 模型验证方法中调用异步方法(用于调用外部 API)。不太确定我将如何解决这个问题,因为我在其他帖子中读过同步 异步可能会导致问题。
    • @Alex 很高兴它成功了。要在 Sync 方法中调用 Async,您可以使用如下方法: public static class AsyncHelper { public static T RunSynchronously(Func> asyncCall) { var threadPoolTask​​ = Task.Run(() => {返回异步调用();});返回threadPoolTask​​.Result;然后你可以像这样使用它:AsyncHelper.RunSynchronously(() => CallYourAsyncMethodAsync());
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多