Как сделать пользовательскую привязку объектной модели в MVC? - PullRequest
1 голос
/ 13 апреля 2011

Я создал пользовательский строковый объект, но он не привязывается к модели, когда я отправляю его обратно на сервер.Есть ли какой-то атрибут, который мне не хватает в классе или что-то в этом роде?

Это пользовательский класс строки ниже:

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

1 Ответ

1 голос
/ 13 апреля 2011

Чтобы объект правильно связывался с помощью подшивки модели по умолчанию, он должен иметь конструктор по умолчанию без параметров:

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, параметр действия должен быть правильно привязан.

Теперь возникает вопрос: действительно ли вы хотите написать весь этот код, когда вы можете иметь модель представления, аналогичную той, которую я показывал изначально?

...