2017-06-05 25 views
1

如果提交了如下所示的表單,並且MyField在表單上留空,則默認情況下,Asp.Net Core模型綁定會將null置於模型的相應屬性中,如下所示。Asp.Net核心模型綁定,如何獲得空字段綁定爲空字符串?

示例形式

<form asp-controller="SomeController" asp-action="SomeAction"> 
     <label asp-for="MyField">My Field</label><input asp-for="MyField" type="text" />  
     <button type="submit">Submit</button> 
</form> 


範例模型

public class MyModel{ 
    public string MyField { get; set; } 
} 


實施例處理法

[HttpPost] 
    public IActionResult Post(MyModel m) { 
      //m.MyField will be null if the field was left empty 
      //but I want it set to a blank string by the model binder 
    } 

但是,由於MyField實際上是在Http Post主體中傳輸的,所以我希望模型綁定器將模型上的MyField屬性設置爲空字符串,而不是將其設置爲null。如果MyField未在Http Post主體中傳輸,我寧願保留空值。如何更改模型聯編程序以顯示此行爲?

回答

1

學習的SimpleTypeModelBinder的Asp.Net核心代號爲https://github.com/aspnet/Mvc/blob/rel/1.1.3/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Binders/SimpleTypeModelBinder.cs我看到有一個ModelMetadata.ConvertEmptyStringToNull設置默認情況下設置爲true,導致空白字符串在數據綁定時轉換爲空。但財產是隻讀,所以起初我無法弄清楚如何改變它的價值。

@ rsheptolut在此頁面發佈https://github.com/aspnet/Mvc/issues/4988讓我找到了解決方案。

解決方案:

值必須被置在啓動時。

 public class CustomMetadataProvider : IMetadataDetailsProvider, IDisplayMetadataProvider { 
      public void CreateDisplayMetadata(DisplayMetadataProviderContext context) { 

       if (context.Key.MetadataKind == ModelMetadataKind.Property) { 

        context.DisplayMetadata.ConvertEmptyStringToNull = false; 
       } 
      } 
     } 

當它鉤住INT到MvcOptions在startup.cs的ConfigureServices方法文件,像這樣

services.AddMvc() 
     .AddMvcOptions(options => options.ModelMetadataDetailsProviders.Add(new CustomMetadataProvider())); 

現在網站廣泛,默認爲空白字段:這可以通過這個類來完成發回的數據綁定器將相應的模型屬性設置爲空字符串而不是null。是啊!

0

您是否嘗試過讓屬性具有空字符串的默認值?

public string MyField { get; set; } = string.Empty; 

一個醜陋的解決辦法是嘗試:

private string myField = string.Empty; 
public string MyField 
{ 
    get { return myField ?? string.Empty; } 
    set { myField = value; } 
} 

,我認爲它應該工作

+0

如果能夠發揮作用,那將會非常酷。這將是一個如此簡單的解決方案。但我只是試過,唉,MyField仍然是空的。在for字段留空的情況下,看來模型聯編程序顯式地將該值設置爲null。爲了確保我在調試器中重複了幾次測試,觀察不同的值。如果我將默認值設置爲「hello」,那麼hello會按照預期返回到model屬性中,但如果將默認值設置爲String.Empty,則返回null。 –

+0

用適合的解決方案更新了我的答案 –

+0

這很有效,如果該屬性爲空但手動將屬性手動設置爲空白字符串,但兩個方法都模糊了該字段是否被回發並且需要代碼始終應用程序。我真正想要的是一種全局改變模型聯編程序的方法,這樣我只需要在一個地方改變這種行爲。 –

相關問題