我只是想知道有没有办法将即将到来的请求值绑定到对象,就像我们在网页中的MVC中那样。
网页开发小型网站比使用mvc更简单。所以我想使用剃刀网页开发网站。
我长时间使用MVC,并且基于约定有自动模型绑定。在任何Action中,您都可以使用TryUpdateModel()
方法绑定复杂对象上的请求值,以获得额外的酷工作。
我可以在页面中看到ModelBinders.Binders.DefaultBinder.BindModel()
方法,但它需要两个长参数。
我想知道将请求参数绑定到C#对象有一种简单快捷的方法:)
寻求帮助。
答案 0 :(得分:2)
Web页面框架中没有模型绑定。该框架是由新手开发人员开发的,主要是考虑到我从项目团队成员那里看到的评论,他们认为他们的目标受众不会理解或使用强类型容器来处理数据(业务对象)。
对于我所从事的项目,我需要这样的东西,所以我构建了自己非常简单的模型绑定器。这是粗略的代码,只处理简单的类型,并没有通过任何类型的绞拧器,但它符合我的目的。您可以将它用作更强大的基础:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
public static class RequestBinder
{
/// <summary>
/// Generates entity instances from Request values
/// </summary>
/// <typeparam name="TEntity">The Type to be generated</typeparam>
/// <param name="request"></param>
/// <returns>TEntity</returns>
public static TEntity Bind<TEntity>(this HttpRequestBase request) where TEntity : class, new()
{
var entity = (TEntity)Activator.CreateInstance(typeof(TEntity));
var properties = typeof(TEntity).GetProperties();
foreach (var property in properties)
{
object safeValue;
Type t = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
try
{
if (t == typeof(String))
{
safeValue = string.IsNullOrEmpty(request[property.Name]) ? null : request[property.Name];
}
else if (t.IsEnum)
{
safeValue = (request[property.Name] == null) ? null : Enum.Parse(t, request[property.Name]);
}
else
{
Type tColl = typeof(ICollection<>);
if (t.IsGenericType && tColl.IsAssignableFrom(t.GetGenericTypeDefinition()) || t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == tColl))
{
continue;
}
safeValue = (request[property.Name] == null) ? null : Convert.ChangeType(request[property.Name], t);
}
property.SetValue(entity, safeValue, null);
}
catch (Exception)
{
}
}
return entity;
}
/// <summary>
/// Populates an existing entity's properties from the Request.Form collection
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="request"></param>
/// <param name="entity"></param>
/// <returns></returns>
public static TEntity Bind<TEntity>(this HttpRequestBase request, TEntity entity) where TEntity : class, new()
{
foreach (string item in request.Form)
{
var property = entity.GetType().GetProperty(item);
if (property != null)
{
object safeValue;
Type t = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
try
{
if (t == typeof(String))
{
safeValue = string.IsNullOrEmpty(request[property.Name]) ? null : request[property.Name];
}
else if (t.IsEnum)
{
safeValue = (request[property.Name] == null) ? null : Enum.Parse(t, request[property.Name]);
}
else
{
Type tColl = typeof(ICollection<>);
if (t.IsGenericType && tColl.IsAssignableFrom(t.GetGenericTypeDefinition()) || t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == tColl))
{
continue;
}
safeValue = (request[property.Name] == null) ? null : Convert.ChangeType(request[property.Name], t);
}
property.SetValue(entity, safeValue, null);
}
catch (Exception)
{
}
}
}
return entity;
}
}
您可以这样使用它:
var person = Request.Bind<Person>();
目前还不清楚Web页面将如何合并到ASP.NET vNext中。 ASP.NET团队已经讨论过消除Web页面,MVC和Web API之间的重复,所以希望这将导致Web页面包括模型绑定。