2016-04-30 56 views
3

我環顧四周,找不到足夠的答案來解決我的問題。使用ASP MVC中的隱式運算符將字符串綁定到參數

我有這樣

public class Title 
{ 
    private readonly string _title; 

    public Title (string title) { 
     _title = title; 
    } 

    public static implicit operator Title(string title) 
    { 
     return new Title(title); 
    } 
} 

定義了一個名爲Title一個包裝類,我在一個ASP MVC項目中使用這個類。現在我定義了一個像這樣的控制器:

public ActionResult Add(string title) 
{ 
    //stuff 
} 

並且這工作正常。 不過,我希望自動張貼的字符串值綁定到Title構造,從而接受的Title而不是string作爲參數:

public ActionResult Add(Title title) 
{ 
    //stuff 
} 

然而,這是不行的,因爲我會得到錯誤: 參數字典中包含參數的空項,表示模型聯編程序無法將該字符串綁定到參數Title

的HTML負責發佈標題數據:存在兩個部分

<form method="post" action="/Page/Add" id="add-page-form">     
    <div class="form-group"> 
     <label for="page-title">Page title</label> 
     <input type="text" name="title" id="page-title"> 
    </div> 
</form> 

我的問題:

1.爲什麼不能做到這一點,我預計bodel粘結劑使用定義的隱式運算符來創建一個Title實例。

2.有沒有一種方法可以在沒有明確創建模型綁定的情況下仍然完成獲取所需的行爲?

+0

你能展示你的觀點嗎?你必須將你的視圖的模型設置爲標題類型不是字符串才能正常工作 –

+0

將帖子發送到此操作的局部視圖不使用模型,它只是一個包含文本字段作爲輸入的表單,我將添加負責的HTML無論張貼。 – Glubus

回答

3

按你的問題:

  1. 模型綁定會調用新標題()。他不能。然後他會嘗試設置Title屬性。他找不到。不,默認聯編程序不會調用隱式轉換。他使用的algorythm是不同的。
  2. 不,您不需要自定義聯編程序,如果您接受更改您的模型,根據默認模型聯編程序的行爲完全錯誤。

對於Action綁定,隱式轉換完全沒有關係。

默認模型聯編程序會從請求的各個部分收集一個大的字典值,並嘗試將它們插入到屬性中。

所以,如果你想用你的標題爲Action參數,最好的辦法是讓標題類粘結劑友好的,可以這麼說:

public class Title 
{ 
    public string Title { get; set; } 

    /* If you really need the conversion for something else... 
    public static implicit operator Title(string title) 
    { 
     return new Title { Title = title }; 
    } 
    */ 
} 

一切都應該工作,因爲它是在客戶端。

如果您不能(或不想)更改您的模型類,那麼您可以使用自定義模型綁定器。但我不認爲你真的需要它。

+0

我希望將給定的字符串隱藏到Title實例中,因此創建公共屬性不是我想要做的事情。我想我會創建一個自定義綁定。它只是覺得應該有辦法做到這一點。哦,謝謝。 – Glubus

+0

私人被高估。爲什麼應該是一個問題,在真實的世界裏,Title屬性不是隻讀的?無論如何,它是一個信使對象。一些理論上的公牛%%噸不算數,抱歉;)我只是在開玩笑!但我鼓勵你按照預期使用框架,而不要重新發明輪子。 –

+0

這是一門學科。標題是不可改變的。一本書有一個標題,本書的標題永遠不會改變(通常,顯然這是一個抽象)。現在至於爲什麼不把這個標題表示爲一個字符串:一個字符串沒有告訴你它的值的語義。標題實例清楚地表示某個標題。這樣可以避免混淆Tttle和Author等屬性,這些屬性通常都表示爲字符串。 – Glubus

1

編譯器不會幫你那裏。這是一個模型綁定問題。 您可以創建自定義ModelBinder

+0

呃原諒我糟糕的術語選擇,顯然模型綁定是運行時完成的。然而,我的問題是爲什麼這不起作用,我知道我可以創建一個自定義模型綁定器,並且在我的問題中聲明,如果使用隱式運算符來解決它,我不希望這樣做。 – Glubus

2

雖然我遲到了,只是爲了覆蓋所有可用的選項的緣故,你可以實現自己的TypeConverter,如下所示:如果您需要實例類

public class TitleConverter : TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return sourceType == typeof(string) ? true : base.CanConvertFrom(context, sourceType); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     if (value is string) 
      return new Title((string)value); 

     return base.ConvertFrom(context, culture, value); 
    } 
} 

[TypeConverter(typeof(TitleConverter))] 
public class Title 
{ 
    ... 
} 

這種做法尤其有用來自不同類型

+0

那麼這在實際意義上完成了什麼?這是否允許我接受「標題」對象,其中活頁夾試圖將字符串綁定到參數?感覺這只是在隱式運算符實現之前要做的事情。我明白這主要是爲了完整性,我只是想知道這是否允許任何比已經提供的答案。 – Glubus

+0

是的,它將'string'綁定到'Title'。把它看作是使用完全不同的基於類型的機制的模型聯編程序的替代品。雖然它允許您將注意力集中在輸入**類型**上,但在某些需要控制器或綁定上下文的場景中,您仍然需要使用活頁夾。 –

+0

漂亮!我可能會嘗試一下,謝謝你離開你的答案,儘管我多久以前發佈了這個。 – Glubus

相關問題