1

カスタム文字列オブジェクトを作成しましたが、サーバーにポストバックしてもモデル バインドされません。クラスなどに欠けている属性はありますか?

これは、以下のカスタム文字列クラスです。

public class EMailAddress
{
    private string _address;
    public EMailAddress(string address)
    {
        _address = address;
    }
    public static implicit operator EMailAddress(string address)
    {
        if (address == null)
            return null;
        return new EMailAddress(address);
    }
}
4

1 に答える 1

1

オブジェクトが既定のモデル バインダーによって正しくバインドされるためには、既定のパラメーターなしのコンストラクターが必要です。

public class EMailAddress
{
    public string Address { get; set; }
}

モデルを示したものとして使用したい場合は、変換を処理するカスタム モデル バインダーを作成する必要があります。

public class EmailModelBinder : DefaultModelBinder
{
    public override object BindModel(
        ControllerContext controllerContext, 
        ModelBindingContext bindingContext
    )
    {
        var email = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (email != null)
        {
            return new EMailAddress(email.AttemptedValue);
        }
        return new EMailAddress(string.Empty);
    }
}

に登録されApplication_Startます:

ModelBinders.Binders.Add(typeof(EMailAddress), new EmailModelBinder());

次のように使用します。

public class HomeController : Controller
{
    public ActionResult Index(EMailAddress email)
    {
        return View();
    }
}

クエリを実行/Home/Index?email=foo@bar.bazすると、アクション パラメータが適切にバインドされます。

ここで問題は、最初に示したようなビュー モデルを使用できる場合、このすべてのコードを本当に書きたいと思うかということです。

于 2011-04-13T14:57:59.530 に答える