我有一些網絡Api操作帶有很多字符串參數。對於其中一些參數,客戶端發送空字符串而不是null,但我需要在空字符串的情況下保存空數據庫。我試着用模型聯編程序和JSONconvertor,但失敗了。web api動作參數將空字符串參數轉換爲空
僅供參考;我需要一個通用的解決方案,因爲我不想在方法體內使用check參數並將它們替換爲null。
我有一些網絡Api操作帶有很多字符串參數。對於其中一些參數,客戶端發送空字符串而不是null,但我需要在空字符串的情況下保存空數據庫。我試着用模型聯編程序和JSONconvertor,但失敗了。web api動作參數將空字符串參數轉換爲空
僅供參考;我需要一個通用的解決方案,因爲我不想在方法體內使用check參數並將它們替換爲null。
您可以在您的字符串屬性上使用DisplayFormat屬性自動將空字符串轉換爲null。
[DisplayFormat(ConvertEmptyStringToNull = true)]
public string MyString { get; set; }
感謝Sarathy,您的解決方案也可以工作,但我用以下解決方案結束: 1)創建自定義的模型綁定像下面
public class EmptyStringModelBinder : System.Web.Mvc.IModelBinder
{
public object BindModel(System.Web.Mvc.ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext)
{
string key = bindingContext.ModelName;
ValueProviderResult val = bindingContext.ValueProvider.GetValue(key);
if (val != null)
{
var s = val.AttemptedValue as string;
if (s != null && (s.IsEmpty() || s.Trim().IsEmpty()))
{
return null;
}
return val.AttemptedValue;
}
return null;
}
}
2)標記的操作方法參數與ModelBinder的屬性
public ActionResult UpdateAttribute(int id,
int AttributeTypeId,
int? Number_Value,
decimal? Money_Value,
[ModelBinder(typeof(EmptyStringModelBinder))]string Text_Value)
或者您可以在配置中添加此模型聯編程序。它將檢查所有字符串參數並用null替換空字符串(可能不需要)
如果在字符串屬性上使用[Required]
屬性,但在數據庫中使其爲空,則WebApi將轉換它在其中接收到的空字符串Json爲空值。
我的要求是相反的。我在數據庫中有一個不可爲空的字段,並且希望將空字符串保存到數據庫中。對於這個需求,我必須刪除[Required]
屬性並添加[DisplayFormat(ConvertEmptyStringToNull = false)]
然後JSON中的空字符串被持久化到數據庫。
+1。 WebAPI驗證任務通常需要在檢查「ModelState.IsValid」之前將所有內容都放在適當的位置。我有像肖恩的要求一樣的情況。但!有一千個模型可以達到150個屬性。我沒有爲每個屬性使用'DisplayFormat'工作,而是來到這樣的解決方案:[link](https://gist.github.com/nakamura-to/4029706) – hastrb 2017-08-29 04:26:04
我已經回答了類似這樣的問題在http://stackoverflow.com/questions/28430031/avoid-null-model-when-no-data-is-posted-in-web-api/28430485# 28430485。除了創建新實例外,您只能找到空字符串參數(如果參數類型是字符串),並在動作參數字典中將其替換爲null。 – Sarathy 2015-02-11 12:14:45
感謝隊友。你的解決方案也可以,但我開發了一個自定義模型綁定見下文。再次感謝 – behtash 2015-02-12 01:37:06