unity3d教程 虚拟现实

2015年03月09日 09:43 0 点赞 0 评论 更新于 2025-11-21 16:46

对于Unity3D虚拟现实,了解的人自然清楚其内涵,而不了解的人则可能感到困惑。本文旨在帮助对Unity3D虚拟现实存在疑惑的人士,深入学习并清晰了解它到底是什么。

自定义ModelBinder与相关代码实现

简单的ModelBinder示例

public class MyModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
return "获取的值并返回";
}
}

[HttpPost]
public ActionResult Index([ModelBinder(typeof(MyModelBinder))] string Temp1, [ModelBinder(typeof(MyModelBinder))] string Temp2)
{
return Content(Temp1 + Temp2);
}

更完善的ModelBinder实现

[HttpPost]
public ActionResult Index([ModelBinder(typeof(MyModelBinder))] string Temp)
{
return Content(Temp);
}

// 自定义ModelBinder
public class MyModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
IValueProvider valueProvider = bindingContext.ValueProvider;
string key = bindingContext.ModelName;
Type modelType = bindingContext.ModelType;
if (valueProvider.ContainsPrefix(key))
{
return valueProvider.GetValue(key).ConvertTo(modelType);
}
return null;
}
}

进一步优化的ModelBinder

public class MyModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
return bindingContext.ValueProvider.GetValue(bindingContext.ModelName).ConvertTo(bindingContext.ModelType);
}
}

处理复杂类型的ModelBinder

// 自定义的ModelBinder
public class MyModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
return GetModel(bindingContext.ValueProvider, bindingContext.ModelType, bindingContext.ModelName);
}

public object GetModel(IValueProvider valueProvider, Type modelType, string modelName)
{
ModelMetadata modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => null, modelType);
// 如果绑定的类型是简单类型
if (!modelMetadata.IsComplexType)
{
return valueProvider.GetValue(modelName).ConvertTo(modelType);
}
object model = Activator.CreateInstance(modelType);
// 如果是复杂类型
// 前台表单标签的name属性的值有modelName的前缀
if (valueProvider.ContainsPrefix(modelName))
{
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(modelType))
{
string strkey = modelName + "." + property.Name;
if (HttpContext.Current.Request.Form.AllKeys.Contains(strkey))
{
property.SetValue(model, valueProvider.GetValue(strkey).ConvertTo(property.PropertyType));
}
}
}
// 不包含前缀,但是标签的name属性的值等于绑定类的属性的名字
else
{
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(modelType))
{
string strkey = property.Name;
if (HttpContext.Current.Request.Form.AllKeys.Contains(strkey))
{
property.SetValue(model, valueProvider.GetValue(strkey).ConvertTo(property.PropertyType));
}
}
}
return model;
}
}

自定义ValueProvider与ValueProviderFactory

自定义ValueProvider

// 自定义ValueProvider
public class MyValueProvider : IValueProvider
{
private string[] allKeys;

public MyValueProvider(ControllerContext controllerContext)
{
allKeys = controllerContext.RequestContext.HttpContext.Request.Form.AllKeys;
}

public bool ContainsPrefix(string prefix)
{
// 此处应补充具体实现逻辑
string strResult = HttpContext.Current.Request.Form[key]; // 这里的key未定义,需修正
// 将原始值(数组),和值的字符串形式封装到一个ValueProviderResult中
ValueProviderResult vpr = new ValueProviderResult(objResult, strResult, System.Globalization.CultureInfo.CurrentCulture);
return vpr;
}
}

自定义ValueProviderFactory

// 自定义ValueProviderFactory
public class MyValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
// 此处构造了无参数的构造函数
return new MyValueProvider();
}
}

在程序启动时添加自定义的ValueProvider

// 在程序启动时将自定义的ValueProvider添加到程序中
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
// 因为在ValueProvider中,只要没有找到响应的值就会向下进行,所以我们将其他的ValueProvider移除
ValueProviderFactories.Factories.RemoveAt(4);
ValueProviderFactories.Factories.RemoveAt(3);
ValueProviderFactories.Factories.RemoveAt(2);
ValueProviderFactories.Factories.RemoveAt(1);
ValueProviderFactories.Factories.RemoveAt(0);
ValueProviderFactories.Factories.Insert(0, new MyValueProviderFactory());
// ValueProviderFactories.Factories.Add(new MyValueProviderFactory());
}

前台表单与Action示例

用户类定义

public class User
{
public int ID { set; get; }
public string Name { set; get; }
}

前台表单

<form id="form0" action="../Home/Index" method="post">
<input type="text" name="use.Name" />
<input type="text" name="Name" />
<input type="submit" value="Submit" />
</form>

Action处理

[HttpPost]
public ActionResult Index([ModelBinder(typeof(MyModelBinder))] User use, [ModelBinder(typeof(MyModelBinder))] User uu)
{
return Content(use.ID.ToString() + use.Name);
}

以上内容是关于Unity3D虚拟现实的部分内容介绍。如果您对Unity3D虚拟现实不了解,可以从这些知识信息开始入手。相信这些总结性的知识信息,对您快速掌握Unity3D虚拟现实会有很大帮助。

标签: unity3d unity3d教程 unity培训

作者信息

boke

boke

共发布了 3994 篇文章