Применимо ли это для размещения методов внутри ASP.NET MVC? - PullRequest
0 голосов
/ 21 сентября 2010

Текущий код одного из представлений в моем проекте - большой, монолитный, и я просто хочу его организовать. Разве это нормально для размещения методов в моем представлении ASP.NET MVC?

Ответы [ 3 ]

4 голосов
/ 21 сентября 2010

Я бы точно сказал, что нет. Цель MVC состоит в том, чтобы отделить интересы, то есть Модель - Представление - Контроллер. В вашем случае вы смешиваете логику Модель / Контроллер с вашим View.

Если вам нужно передать сложный контент в ваше представление, вы должны создать пользовательские ViewData классы, заполнить их в своем контроллере и передать в ваше представление.

Если ваши методы больше связаны с генерацией разметки View, вам следует взглянуть на разделение ее на частичные представления или, как уже предлагалось, с использованием методов расширения помощника.

1 голос
/ 21 сентября 2010

Нет.

Переместите контроллер, при необходимости введите вид модели. После этого определите свои собственные помощники HTML, учитывая, что они должны быть для html-подобных вещей, а не для какой-либо логики.

У вас может быть что-то в представлении v. V. Специфичное для него, и просто невозможно, чтобы бит кода делал что-то вне этого. Но даже тогда вы можете просто определить его в качестве помощника, при условии, что в названии очень четко указано, что он делает, вы лучше, чем поместить его в представление. Вы можете использовать помощников для юнит-тестирования, поэтому при этом есть явное преимущество.

1 голос
/ 21 сентября 2010

Это возможно, но если вам нужны методы внутри представления, возможно, вам следует вместо этого рассмотреть возможность расширения объекта Html методом расширения, а затем использовать эти методы из представления. Мне нравится разделять свои расширения по функциональности, чтобы представление было читабельным. Например:

public static MySpecialDateHelper SpecialDateHelper(this HtmlHelper helper)
{
    return new MySpecialDateHelper(helper);
}


public class MySpecialDateHelper
{
    // Fields
    private HtmlHelper m_helper;
    private StringBuilder m_sb = new StringBuilder();

    // Methods
    internal MySpecialDateHelper(HtmlHelper helper)
    {
        this.m_helper = helper;
    }

        // Print date prettily
        public public string PrettyDate(datetime target)
    {
        // format however
        return string.format("pretty {0}", target.ToString());
    }

    // Print date prettily
        public public string PrettyDateInATextbox(datetime target)
    {
        return m_helper.TextBox("prettyid",PrettyDate(target));
    }

    // etc...
}

Тогда, на ваш взгляд, вам просто нужно сослаться на расширение, которое вы только что создали

<%= Html.SpecialDateHelper.PrettyDateInATextbox(Now); %>

Конечно, ваше разделение методов на расширения может отличаться, вы также можете напрямую расширять объект HtmlHelper методами, но я предпочитаю этот метод

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