Asp.net Razor网页将值绑定到对象

时间:2014-11-24 11:02:09

标签: razor asp.net-webpages

我只是想知道有没有办法将即将到来的请求值绑定到对象,就像我们在网页中的MVC中那样。

网页开发小型网站比使用mvc更简单。所以我想使用剃刀网页开发网站。

我长时间使用MVC,并且基于约定有自动模型绑定。在任何Action中,您都可以使用TryUpdateModel()方法绑定复杂对象上的请求值,以获得额外的酷工作。

我可以在页面中看到ModelBinders.Binders.DefaultBinder.BindModel()方法,但它需要两个长参数。

我想知道将请求参数绑定到C#对象有一种简单快捷的方法:)

寻求帮助。

1 个答案:

答案 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页面包括模型绑定。