C# JObject Webapi中的模型验证

C# JObject Webapi中的模型验证,c#,asp.net-web-api,C#,Asp.net Web Api,使用JObject将数据传递给webapi,如何对从JObject返回的对象执行模型验证?我使用angurlarjs进行绑定,使用DTO进行模型 [System.Web.Http.HttpPost] public HttpResponseMessage InsertSchoolBranch(JObject jsonData) { try { dynamic json = jsonD

使用JObject将数据传递给webapi,如何对从JObject返回的对象执行模型验证?我使用angurlarjs进行绑定,使用DTO进行模型

 [System.Web.Http.HttpPost]
        public HttpResponseMessage InsertSchoolBranch(JObject jsonData)
        {

            try
            {
                dynamic json = jsonData;    
                JObject jbranchInfo = json.branchInfo;
                JObject jbranchPolicy = json.branchPolicy;


                var branchInfo = jbranchInfo.ToObject<SchoolBranch>();
                var branchPolicy = jbranchPolicy.ToObject<SchoolPolicy>();

                int schoolId = Convert.ToInt32(UserDataPieces(2));
                int userId = Convert.ToInt32(UserDataPieces(0));

                unitOfWork.SchoolManagerRepository.InsertSchoolBranch(branchInfo, branchPolicy, userId, schoolId, ref message);

                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (UnauthorizedAccessException)
            {
                return Request.CreateResponse(HttpStatusCode.Unauthorized);
            }
            catch (Exception)
            {
                return Request.CreateResponse(HttpStatusCode.InternalServerError);


            }


        }
[System.Web.Http.HttpPost]
公共HTTPResponseMessageInsertSchoolBranch(JObject jsonData)
{
尝试
{
动态json=jsonData;
JObject jbranchInfo=json.branchInfo;
JObject jbranchPolicy=json.branchPolicy;
var branchInfo=jbrancinfo.ToObject();
var branchPolicy=jbranchPolicy.ToObject();
int schoolId=Convert.ToInt32(UserDataPieces(2));
int userId=Convert.ToInt32(UserDataPieces(0));
unitOfWork.SchoolManagerRepository.InsertSchoolBranch(branchInfo、branchPolicy、userId、schoolId、ref消息);
返回新的HttpResponseMessage(HttpStatusCode.OK);
}
捕获(未经授权的访问例外)
{
返回请求.CreateResponse(HttpStatusCode.Unauthorized);
}
捕获(例外)
{
返回请求.CreateResponse(HttpStatusCode.InternalServerError);
}
}

< /代码> 如果您想验证输入数据,请考虑用自定义ActudiFieldRealts装饰它们。

[RequiresJsonBody("SchoolBranch","SchoolPolicy")]
public HttpResponseMessage InsertSchoolBranch(JObject jsonData)
{
    // Stuff...
}
或者使用一些元组作为模型

public class RequiresJsonBody : ActionFilterAttribute
{
    private string paramName;

    public RequiresJsonBody (string paramName)
    {
        this.paramName = paramName;
    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        IDictionary<string, string> errors = new Dictionary<string, string>();

        // Validate incoming. Add key / error messages to dictionary...

        foreach (var err in errors)
        {
            actionContext.ModelState.AddModelError(err.Key, err.Value);
        }

        if (!actionContext.ModelState.IsValid
            && errors.Keys.Count > 0)
        {
            actionContext.Response
                = actionContext.Request.CreateErrorResponse(
                    HttpStatusCode.BadRequest,
                    String.Join(" ", errors.Values.ToArray()));
        }
    }
}
公共类RequiresJsonBody:ActionFilterAttribute
{
私有字符串参数名;
public RequiresJsonBody(字符串参数名)
{
this.paramName=paramName;
}
公共重写无效OnActionExecuting(HttpActionContext actionContext)
{
IDictionary errors=新字典();
//验证传入。将密钥/错误消息添加到字典。。。
foreach(var err in errors)
{
actionContext.ModelState.AddModelError(err.Key,err.Value);
}
如果(!actionContext.ModelState.IsValid)
&&errors.Keys.Count>0)
{
actionContext.Response
=actionContext.Request.CreateErrorResponse(
HttpStatusCode.BadRequest,
Join(“,errors.Values.ToArray());
}
}
}

如果发布强类型模型而不是动态的
JObject
,则可以使用验证属性来修饰模型属性,并在操作中检查
ModelState.IsValid
。Hello@Jasen,尝试过,但无效。它抛出一个或多个实体的验证失败的错误
。有关更多详细信息,请参阅“EntityValidationErrors”属性。
@uikrosoft收到此错误时,您能否共享完整的代码和请求详细信息请参阅并共享有关错误的一些详细信息。您好@Jonas,我遵循了您的示例,但我仍然收到一个或多个实体的
验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。
我进行了跟踪,发现它在执行操作时进入了
OnActionExecuting
。@uikrosoft也许您应该查看异常。似乎您可能有db模型问题。尝试对unitOfWork.SchoolManagerRepository使用一些调试实现,它只将模型写入调试器,而不是实体框架。还是退房