unity3d教程 虚拟现实
对于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培训