如何将结果模型对象传递出 System.Web.Http.ModelBinding.IModelBinder。绑定模型?
how to pass the result model object out of System.Web.Http.ModelBinding.IModelBinder. BindModel?
这是回答
的后续问题
现在我可以成功提取内容,应用反序列化并获得我想要的对象。我如何将它传递给动作?提供的函数 BindModel
必须 return 一个 bool
值,这让我很困惑。
我的代码:
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
actionContext.Request.Content.ReadAsStringAsync().ContinueWith(deserialize);
return true;
}
#endregion
#region Methods
private static void deserialize(Task<string> content)
{
string formData = content.Result; // {"content":"asdasd","zip":"12321","location":"POINT (1 2)"}
Match locationMatch = Regex.Match(
formData,
@"""location"":""POINT(.+)""",
RegexOptions.IgnoreCase | RegexOptions.Singleline);
if (!locationMatch.Success)
{
throw new ModelValidationException("Post data does not contain location part");
}
string locationPart = locationMatch.Value;
formData = formData.Replace(locationPart, string.Empty);
var serializer = new JavaScriptSerializer();
var post = serializer.Deserialize<Post>(formData);
post.Location = DbGeography.FromText(locationPart);
// how am I supposed to pass `post` to the action method?
}
我假设您的问题与 Web API 有关(与 ASP.net vnext 无关)。假设的原因是您在示例中提供的方法以及旧问题。
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
actionContext.Request.Content.ReadAsStringAsync().ContinueWith(deserialize);
bindingContext.Model = your model; // You can return from static method or you can pass bindingContext to static method and set model over there.
return true;
}
现在谈谈你的困惑。
在 Web API 中,您可以注册许多模型绑定器(其中一些默认注册)和一些您注册并全部实现 IModelBinder。因此,当它尝试解析请求数据时,它会转到许多模型绑定器,当你在 BindModel 中 return true 时,它将停在那里,之后所有模型绑定器都会被丢弃。
可以在此处找到更多详细信息。 (在那里你可以看到模型绑定器部分)
http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
这是回答
的后续问题现在我可以成功提取内容,应用反序列化并获得我想要的对象。我如何将它传递给动作?提供的函数 BindModel
必须 return 一个 bool
值,这让我很困惑。
我的代码:
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
actionContext.Request.Content.ReadAsStringAsync().ContinueWith(deserialize);
return true;
}
#endregion
#region Methods
private static void deserialize(Task<string> content)
{
string formData = content.Result; // {"content":"asdasd","zip":"12321","location":"POINT (1 2)"}
Match locationMatch = Regex.Match(
formData,
@"""location"":""POINT(.+)""",
RegexOptions.IgnoreCase | RegexOptions.Singleline);
if (!locationMatch.Success)
{
throw new ModelValidationException("Post data does not contain location part");
}
string locationPart = locationMatch.Value;
formData = formData.Replace(locationPart, string.Empty);
var serializer = new JavaScriptSerializer();
var post = serializer.Deserialize<Post>(formData);
post.Location = DbGeography.FromText(locationPart);
// how am I supposed to pass `post` to the action method?
}
我假设您的问题与 Web API 有关(与 ASP.net vnext 无关)。假设的原因是您在示例中提供的方法以及旧问题。
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
actionContext.Request.Content.ReadAsStringAsync().ContinueWith(deserialize);
bindingContext.Model = your model; // You can return from static method or you can pass bindingContext to static method and set model over there.
return true;
}
现在谈谈你的困惑。
在 Web API 中,您可以注册许多模型绑定器(其中一些默认注册)和一些您注册并全部实现 IModelBinder。因此,当它尝试解析请求数据时,它会转到许多模型绑定器,当你在 BindModel 中 return true 时,它将停在那里,之后所有模型绑定器都会被丢弃。
可以在此处找到更多详细信息。 (在那里你可以看到模型绑定器部分) http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api