2012-08-24 62 views
1

我沒有任何運氣讓我的視圖模型上的屬性調用自定義值提供程序。我試圖使用自定義值提供程序將一些標準請求數據(如UserHostAddress)封裝到我的視圖模型中。ValueProvider沒有調用屬性不是形式

例如,我的視圖模型的樣子:

public class MyViewModel 
{ 
    public string Name { get; set; } 

    public string IPAddress { get; set; } 
} 

我想我的自定義值提供商自動填充IPAddress屬性。不幸的是,GetValue永遠不會被該屬性調用。這看起來很奇怪,因爲我認爲DefaultModelBinder會遍歷模型的屬性並檢查值提供者的值。

+0

您註冊了您的自定義提供商工廠嗎? – Eranga

+0

我想我有同樣的問題。 'GetValue' * only *似乎在我的請求包含任何其他屬性時調用待填充屬性(例如,在您的情況下:如果'name'將作爲路由參數或通過查詢字符串傳遞),但不包括任何參數。在這種情況下,我的控制器只接收'MyViewModel'的'null'。 'GetValue'被參數和一個空字符串的名稱調用,但不是用於待填充的屬性(在你的例子中是'IPAddress')。 你有沒有找到原因,也許是一個解決方案? –

回答

2

你可以有一個自定義值提供商:

public class MyValueProvider : IValueProvider 
{ 
    public bool ContainsPrefix(string prefix) 
    { 
     return true; 
    } 

    public ValueProviderResult GetValue(string key) 
    { 
     if (key.EndsWith("Name")) 
     { 
      var value = "john"; 
      return new ValueProviderResult(value, value, CultureInfo.InvariantCulture); 
     } 
     else if (key.EndsWith("IPAddress")) 
     { 
      var value = "127.0.0.1"; 
      return new ValueProviderResult(value, value, CultureInfo.InvariantCulture); 
     } 

     return null; 
    } 
} 

和相應的工廠:

public class MyValueProviderFactory : ValueProviderFactory 
{ 
    public override IValueProvider GetValueProvider(ControllerContext controllerContext) 
    { 
     return new MyValueProvider(); 
    } 
} 

將在Application_Start註冊:

ValueProviderFactories.Factories.Add(new MyValueProviderFactory()); 

,現在你可以有一個控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

和視圖:

@model MyViewModel 

@Html.DisplayFor(x => x.Name) 
@Html.DisplayFor(x => x.IPAddress) 

@using (Html.BeginForm()) 
{ 
    <button type="submit">OK</button> 
} 

您的自定義值提供商將通過默認的模型綁定使用。

+0

也許我不清楚。我有一個自定義值提供程序,但它的GetValue方法未被調用。我找到了答案,並將更新問題。 –

相關問題