Как добавить свойства в ранее созданный объект - PullRequest
0 голосов
/ 04 января 2011

Я не уверен, имеет ли смысл то, что я пытаюсь сделать.Я пытаюсь создать переносимый виджет разбиения на страницы для использования в asp.net mvc.

Хитрость заключается в том, что я храню объект для значений маршрута.затем определите информацию о базовом маршруте на уровне контроллера следующим образом:

        PaginatedList<Member> paginatedMembers = new PaginatedList<Member>(members, page, 2);
        // define base url route
        paginatedMembers.PaginationData.PageRoute = new { controller = "AdminMember", action = "MemberList", keyword = keyword };

Это позволяет мне добавлять значения, например keyword=keyword, для случая, когда ссылки на страницы должны иметь дополнительные данные.

Затем отображается нумерация страниц с общим частичным видом:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Genesis_0_02.Utilities.PaginationData>" %>

<% if (Model.HasPreviousPage) { %> 
        <%: Html.ActionLink("Previous", ViewContext.RouteData.Values["action"].ToString(), new { page = (Model.PageIndex - 1) })%>

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

    <% } %>

    <% if (Model.HasNextPage) {  %> 
        <%: Html.ActionLink("Next", ViewContext.RouteData.Values["action"].ToString(), new { page = (Model.PageIndex + 1) })%>
    <% } %> 

Как вы можете видеть ... приведенный выше частичный вид еще не завершен.Я специально работаю над этой строкой:

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

Есть ли способ сделать это?

1 Ответ

2 голосов
/ 04 января 2011

Вы можете изменить свой класс PaginationData примерно так:Примечание: я переименовал свойство PageRoute в RouteValues для согласованности с платформой MVC.

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;

Альтернативный подход с использованием методов расширения для объединения RouteValueDictionaries

Ниже приведены некоторые методы расширения, которые предоставляют некоторые функции для RouteValueDictionaries.

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 }))

Недостатком является то, что происходит некоторое чрезмерное отражение и создание новых объектов RouteValueDictionary, происходящих в данный момент.с таким подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...