mvc html绑定变量,c# – Asp.Net MVC 3使用变量对象进行自定义模型绑定

我的实体:( PersonModel应该有一个AddressOne或AddressTwo类型的地址(可能还有其他),所以PersonModel有一个地址字段的对象类型.)

public class Person

{

public int PersonId { get; set; }

public string Name { get; set; }

public string Surname { get; set; }

public object Address { get; set; }

}

public class AddressOne

{

public string Street { get; set; }

public string City { get; set; }

}

public class AddressTwo

{

public string Province { get; set; }

public string State { get; set; }

}

模型:(我在typeOfAddress中传递一个隐藏字段,以匹配表单提交后的正确地址)

public class PersonModel

{

private System.Type _typeOfAddress;

private object _address;

[Required]

public int PersonId { get; set; }

[Required]

public string Name { get; set; }

[Required]

public string Surname { get; set; }

public System.Type typeOfAddress

{

get { return _typeOfAddress; }

set { _typeOfAddress = value; }

}

public object Address

{

get {

return _address;

}

set {

_address = value;

_typeOfAddress = _address.GetType();

}

}

}

public class AddressOneModel

{

[Required]

public string Street { get; set; }

[Required]

public string City { get; set; }

}

public class AddressTwoModel

{

[Required]

public string Province { get; set; }

[Required]

public string State { get; set; }

}

我的观点(对于地址栏我有广告编辑模板,在此代码中省略):

@using (Html.BeginForm()) {

  • PersonId: @Html.EditorFor(model => model.PersonId)

  • Name: @Html.EditorFor(model => model.Name)

  • Surname: @Html.EditorFor(model => model.Surname)

  • Address:

  • @Html.HiddenFor(model => model.typeOfAddress)

    @Html.EditorFor(model => model.Address)

Submit

}

然后是我的控制器:(在这个例子中我在模型中加载了AddressOne,但应该是一个或两个取决于运行时……)

[HttpGet]

public ActionResult Index()

{

PersonModel myPerson = new PersonModel();

myPerson.PersonId = 1;

myPerson.Name = "Michael";

myPerson.Surname = "Douglas";

AddressOneModel Address = new AddressOneModel();

Address.Street = "5th Avenue";

Address.City = "New York";

myPerson.Address = Address;

return View(myPerson);

}

[HttpPost]

public ActionResult Index([ModelBinder(typeof(PersonModelBinder))]PersonModel myPerson)

{

if (ModelState.IsValid) {

// some things here

}

return View();

}

然后是PersonModel的Model Binder:

public class PersonModelBinder : IModelBinder

{

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)

{

PersonModel bindedModel = new PersonModel();

foreach (var Property in typeof(PersonModel).GetProperties())

{

PropertyInfo info = bindedModel.GetType().GetProperty(Property.Name);

object castedInfo = new object();

var uType = info.PropertyType;

if (uType == typeof(string))

{

castedInfo = bindingContext.ValueProvider.GetValue(Property.Name).AttemptedValue.ToString();

}

else if (uType == typeof(Type))

{

castedInfo = Type.GetType(bindingContext.ValueProvider.GetValue(Property.Name).AttemptedValue.ToString());

}

else if (uType == typeof(object))

{

string objType = bindingContext.ValueProvider.GetValue("typeOfAddress").AttemptedValue;

object address = (object)Activator.CreateInstance(Type.GetType(objType));

// another foreach as previous

}

else

{

object uCasted = (object)Activator.CreateInstance(info.PropertyType);

uCasted = Convert.ChangeType(bindingContext.ValueProvider.GetValue(Property.Name).AttemptedValue, Property.PropertyType);

castedInfo = uCasted;

}

info.SetValue(bindedModel, castedInfo, null);

}

return bindedModel;

}

这是实现PersonModel绑定的正确方法吗?那么[Post]控制器中的验证呢?

我也看到了一种以这种方式使用DefaultBinder的方法:

[ModelBinderType(typeof(PersonModel))]

public class PersonModelBinder : DefaultModelBinder

{

//...

}

但我没有在MVC3中找到任何ModelBinderType的参考!有什么建议吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值