我没有运气在我的视图模型上为一个属性调用自定义值提供程序。我正在尝试使用自定义值提供程序将一些标准请求数据(例如UserHostAddress)封装到我的视图模型中。
例如,我的视图模型如下:
public class MyViewModel
{
public string Name { get; set; }
public string IPAddress { get; set; }
}
我希望自定义值提供程序自动填充IPAddress属性。不幸的是,从来没有为该属性调用GetValue。这看起来很奇怪,因为我认为DefaultModelBinder将迭代模型的属性并检查值提供者的值。
答案 0 :(得分: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>
}
您的自定义值提供程序将由默认模型绑定器使用。