ValueProvider没有调用不在表单中的属性

时间:2012-08-24 03:01:58

标签: asp.net-mvc model-binding

我没有运气在我的视图模型上为一个属性调用自定义值提供程序。我正在尝试使用自定义值提供程序将一些标准请求数据(例如UserHostAddress)封装到我的视图模型中。

例如,我的视图模型如下:

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

    public string IPAddress { get; set; }
}

我希望自定义值提供程序自动填充IPAddress属性。不幸的是,从来没有为该属性调用GetValue。这看起来很奇怪,因为我认为DefaultModelBinder将迭代模型的属性并检查值提供者的值。

1 个答案:

答案 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>
}

您的自定义值提供程序将由默认模型绑定器使用。