Чтобы объект правильно связывался с помощью подшивки модели по умолчанию, он должен иметь конструктор по умолчанию без параметров:
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
, параметр действия должен быть правильно привязан.
Теперь возникает вопрос: действительно ли вы хотите написать весь этот код, когда вы можете иметь модель представления, аналогичную той, которую я показывал изначально?