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

 2023-09-25 阅读 29 评论 0

摘要:我的实体:( PersonModel应该有一个AddressOne或AddressTwo类型的地址(可能还有其他),所以PersonModel有一个地址字段的对象类型.)javascript自定义对象。public class Person{mvc项目中能用vue吗?public int PersonId { get; set; }public string Name { get; set; }html怎么

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

javascript自定义对象。public class Person

{

mvc项目中能用vue吗?public int PersonId { get; set; }

public string Name { get; set; }

html怎么定义变量。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的参考!有什么建议吗?

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/93880.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息