Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何向以前创建的对象添加属性_C#_Asp.net Mvc_Asp.net Mvc 2 - Fatal编程技术网

C# 如何向以前创建的对象添加属性

C# 如何向以前创建的对象添加属性,c#,asp.net-mvc,asp.net-mvc-2,C#,Asp.net Mvc,Asp.net Mvc 2,我不确定我想做的是否有意义。我正在尝试制作一个可移植的分页小部件,以便在asp.net mvc中使用 棘手的部分是,我正在为路由值存储一个对象 public class PaginatedList<T> : List<T> { public PaginationData PaginationData { get; private set; } public PaginatedList(IQueryable<T> source, int pag

我不确定我想做的是否有意义。我正在尝试制作一个可移植的分页小部件,以便在asp.net mvc中使用

棘手的部分是,我正在为路由值存储一个对象

public class PaginatedList<T> : List<T>
{
    public PaginationData PaginationData { get; private set; }

    public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize)
    {
        PaginationData = new PaginationData( source.Count() , pageIndex, pageSize);
        this.AddRange(source.Skip((PaginationData.PageIndex - 1) * PaginationData.PageSize).Take(PaginationData.PageSize));
    }

}

public class PaginationData
{
    ////////////////////////////////////////////
    public object PageRoute { get; set; } //   <-- object for route values
    ////////////////////////////////////////////
    public bool HasPreviousPage { get { return (PageIndex > 1); } }
    public bool HasNextPage { get { return (PageIndex < TotalPages); } }
    public int PageIndex { get; private set; }
    public int PageSize { get; private set; }
    public int TotalCount { get; private set; }
    public int TotalPages { get; private set; }

    public PaginationData(int count, int pageIndex, int pageSize)
    {
        PageIndex = pageIndex;
        PageSize = pageSize;
        TotalCount = count;
        TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
    }
}
正如你所看到的。。。以上部分视图尚未完成。我专门从事这方面的工作:

            <!--How do I add {page=i} to Model.PageRoute object below?-->
            <%: Html.RouteLink(i.ToString(), Model.PageRoute)%>


有办法做到这一点吗?

您可以将PaginationData类修改为如下内容。注意:为了与MVC框架保持一致,我将
PageRoute
属性重命名为
RouteValues

public class PaginationData
{
    private System.Web.Routing.RouteValueDictionary _RouteValues;

    public System.Web.Routing.RouteValueDictionary RouteValues
    {
        get
        {
            if (_RouteValues == null)
            {
                _RouteValues = new System.Web.Routing.RouteValueDictionary();
            }
            return _RouteValues;
        }
        private set { _RouteValues = value; }
    }

    public void SetRouteValues(object routeValues)
    {
        this.RouteValues = new System.Web.Routing.RouteValueDictionary(routeValues);
    }

    public bool HasPreviousPage { get { return (PageIndex > 1); } }
    public bool HasNextPage { get { return (PageIndex < TotalPages); } }
    public int PageIndex { get; private set; }
    public int PageSize { get; private set; }
    public int TotalCount { get; private set; }
    public int TotalPages { get; private set; }

    public PaginationData(int count, int pageIndex, int pageSize)
    {
        PageIndex = pageIndex;
        PageSize = pageSize;
        TotalCount = count;
        TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
    }
}

使用扩展方法合并RouteValueDictionary的替代方法 下面是一些扩展方法,它们为RouteValueDictionary提供了一些功能

public static class RouteValueExtensions
{
    public static void Merge(this RouteValueDictionary routeValuesA, object routeValuesB)
    {
        foreach (var entry in new RouteValueDictionary(routeValuesB))
        {
            routeValuesA[entry.Key] = entry.Value;
        }
    }

    public static RouteValueDictionary With(this RouteValueDictionary routeValuesA, object routeValuesB)
    {
        routeValuesA.Merge(routeValuesB);
        return routeValuesA;
    }

    public static RouteValueDictionary With(this RouteValueDictionary routeValues, params object[] routeValuesToMerge)
    {
        if (routeValues != null)
        {
            for (int i = 0; i < routeValuesToMerge.Length; i++)
            {
                routeValues.Merge(routeValuesToMerge[i]);
            }
        }
        return routeValues;
    }

    public static RouteValueDictionary RouteValues(this HtmlHelper htmlHelper, object routeValues)
    {
        return new RouteValueDictionary(routeValues);
    }

    public static RouteValueDictionary RouteValues(this HtmlHelper htmlHelper, object routeValuesA, object routeValuesB)
    {
        return htmlHelper.RouteValues(routeValuesA).With(routeValuesB);
    }

    public static RouteValueDictionary RouteValues(this HtmlHelper htmlHelper, params object[] routeValues)
    {
        if (routeValues != null && routeValues.Length > 0)
        {
            var result = htmlHelper.RouteValues(routeValues[0]);
            for (int i = 1; i < routeValues.Length; i++)
            {
                result.Merge(routeValues[i]);
            }
            return result;
        }
        else
        {
            return new RouteValueDictionary();
        }
    }
}


缺点是,这种方法会对新的RouteValueDictionary对象进行一些过度的反射和实例化。

我想我可以用HtmlHelper来实现。有什么方法可以避免使用html帮助程序吗?您使用的
似乎有点过火,因为只有一个页面才起作用。当存在多个页面时,它会抛出一个错误:
已添加具有相同键的项。
。似乎我应该使用html助手路径。谢谢您的编辑。我认为如果我不使用助手,我的局部视图中可能会有太多的逻辑。不过非常感谢您提供的信息。RouteValueDictionary正在抛出该错误,因为您正在调用
Add
方法并传入字典中已经存在的键。尝试
Model.RouteValues[“page”]=i取而代之。这在两种情况下都适用:要么添加新密钥,要么更新现有密钥。是的,一个简单的替代方法是合并从多个
对象创建的
RouteValueDictionaries
;作为
HtmlHelper
对象的扩展方法,一些通用的东西是有意义的。。。我没有意识到
Model.RouteValues[key]=value
将同时处理添加和更新。
public class PaginationData
{
    private System.Web.Routing.RouteValueDictionary _RouteValues;

    public System.Web.Routing.RouteValueDictionary RouteValues
    {
        get
        {
            if (_RouteValues == null)
            {
                _RouteValues = new System.Web.Routing.RouteValueDictionary();
            }
            return _RouteValues;
        }
        private set { _RouteValues = value; }
    }

    public void SetRouteValues(object routeValues)
    {
        this.RouteValues = new System.Web.Routing.RouteValueDictionary(routeValues);
    }

    public bool HasPreviousPage { get { return (PageIndex > 1); } }
    public bool HasNextPage { get { return (PageIndex < TotalPages); } }
    public int PageIndex { get; private set; }
    public int PageSize { get; private set; }
    public int TotalCount { get; private set; }
    public int TotalPages { get; private set; }

    public PaginationData(int count, int pageIndex, int pageSize)
    {
        PageIndex = pageIndex;
        PageSize = pageSize;
        TotalCount = count;
        TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
    }
}
Model.RouteValues.Add("key", value);
Model.RouteValues["key"] = value;
public static class RouteValueExtensions
{
    public static void Merge(this RouteValueDictionary routeValuesA, object routeValuesB)
    {
        foreach (var entry in new RouteValueDictionary(routeValuesB))
        {
            routeValuesA[entry.Key] = entry.Value;
        }
    }

    public static RouteValueDictionary With(this RouteValueDictionary routeValuesA, object routeValuesB)
    {
        routeValuesA.Merge(routeValuesB);
        return routeValuesA;
    }

    public static RouteValueDictionary With(this RouteValueDictionary routeValues, params object[] routeValuesToMerge)
    {
        if (routeValues != null)
        {
            for (int i = 0; i < routeValuesToMerge.Length; i++)
            {
                routeValues.Merge(routeValuesToMerge[i]);
            }
        }
        return routeValues;
    }

    public static RouteValueDictionary RouteValues(this HtmlHelper htmlHelper, object routeValues)
    {
        return new RouteValueDictionary(routeValues);
    }

    public static RouteValueDictionary RouteValues(this HtmlHelper htmlHelper, object routeValuesA, object routeValuesB)
    {
        return htmlHelper.RouteValues(routeValuesA).With(routeValuesB);
    }

    public static RouteValueDictionary RouteValues(this HtmlHelper htmlHelper, params object[] routeValues)
    {
        if (routeValues != null && routeValues.Length > 0)
        {
            var result = htmlHelper.RouteValues(routeValues[0]);
            for (int i = 1; i < routeValues.Length; i++)
            {
                result.Merge(routeValues[i]);
            }
            return result;
        }
        else
        {
            return new RouteValueDictionary();
        }
    }
}
Html.RouteLink(i.ToString(), Html.RouteValues(Model.PageRoute, new { page = i }))
Html.RouteLink(i.ToString(), Html.RouteValues(Model.PageRoute).With(new { page = i }))