1

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

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

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

    public string IPAddress { get; set; }
}

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

4

1 回答 1

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

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

于 2012-08-24T05:41:35.640 回答