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 に答える