[英]Deserialize from HttpRequest not working correctly in web api
我有一個自定義模型活頁夾,以從來自FormData
應用程序的FormData
中獲取一些值。 除了一個特定的屬性: TenantDomainUrl
其他所有東西都可以正常工作。 進行反序列化時,即使在請求中發送了該值,該值也設置為null
:
圖片1 :(就在發送請求之前,請檢查控制台:
自定義模型聯編程序代碼是這樣的:
public class TenantModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType != typeof(Tenant))
{
return false;
}
var task = Task.Run(async () =>
{
var model = new Tenant();
if (!actionContext.Request.Content.IsMimeMultipartContent())
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "WebRequeest content 'multipart/form-data' is valid");
}
else
{
var provider = await actionContext.Request.Content.ReadAsMultipartAsync();
//var fileContent = provider.Contents.FirstOrDefault(n => n.Headers.ContentDisposition.Name.Equals("file"));
var fileContent = provider.Contents.FirstOrDefault(n => n.Headers.ContentDisposition.Name.Equals(@"""file"""));
if (fileContent == null)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Section 'file' is missed");
}
//var modelContent = provider.Contents.FirstOrDefault(n => n.Headers.ContentDisposition.Name.Equals("model"));
var modelContent = provider.Contents.FirstOrDefault(n => n.Headers.ContentDisposition.Name.Equals(@"""model"""));
if (modelContent == null)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Section 'model' is missed");
}
if (fileContent != null && modelContent != null)
{
model = JsonConvert.DeserializeObject<Tenant>(
await modelContent.ReadAsStringAsync());
model.CertificateFile = fileContent.ReadAsByteArrayAsync().Result;
}
}
return model;
});
task.Wait();
bindingContext.Model = task.Result;
return true;
}
}
反序列化后的第二張圖片
我認為我實際上不需要發布REACT JS代碼
更新:
readasstring使用值正確返回json,但是反序列化后該屬性為null:
更新2,租戶類
public class Tenant
{
[JsonProperty("id")]
public string TenantDomainUrl { get; set; }
public string ApplicationId { get; set; }
public string SiteCollectionTestUrl { get; set; }
public string CertificatePassword { get; set; }
public byte[] CertificateFile { get; set; }
public Uri CertificatePath { get; set; }
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
由於JsonProperty
它不會從TenantDomainUrl
JSON
值中讀取,而是從id
讀取。
[JsonProperty("id")]
刪除屬性,或更改發布的JSON
。
UPDATE
在上面的第一張照片中,我注意到
"id":null
參考之前關於該主題的文章,請確保通過您的FormData
傳遞此id
並帶有鍵id
和值集,如下所示。
data.append("model", JSON.stringify({ "id": "your-id-goes-here" }}
編輯:
如果[JsonProperty("id")]
必須保留在TenantDomainUrl上 ,則需要更改發布到此端點的JSON,使其具有id的鍵而不是TenantDomainUrl 。 像這樣
{"id":"cm.microsoft.com","ApplicationId":"a21-fan-...", /* other properties in your JSON */}
代替
{"TenantDomainUrl":"cm.microsoft.com","ApplicationId":"a21-fan-...", /* other properties in your JSON */}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.