Улучшить разделение зрения и логики - PullRequest
0 голосов
/ 26 февраля 2012

Я разрабатываю какое-то веб-приложение, я выбрал _layout.cshtml, фрагмент которого:

//some html
<h4>Your account</h4>
@{ Html.RenderPartial("UserMenu"); }

отвечает за отображение меню. Он имеет 3 возможных состояния: войти в систему как администратор, войти как простой пользователь, но не войти в систему. Я сделал это частичное представление так:

@if (User.IsInRole("Admin"))
{
    @:Admin menu
}
else
{
    if (User.Identity.IsAuthenticated)
    {
        @:Normal menu
    }

    else
    {
        @Html.ActionLink("Login", "Logon", "Account");
    }
}

Но я не удовлетворен этим решением, так как оно плохо разделяет логику и представление. Как вы предлагаете улучшить его?

Ответы [ 3 ]

2 голосов
/ 26 февраля 2012

Но я не удовлетворен этим решением, так как оно плохо разделяет логику и представление

Я не согласен.Для меня такая логика вполне приемлема с точки зрения.Вы могли бы написать собственный HTML-помощник, который мог бы использоваться следующим образом в вашем макете:

<h4>Your account</h4>
@Html.Menu()

и поместить логику в помощник вместо использования этой части.И если вы решите реализовать это, вот как это может выглядеть:

public static class HtmlExtensions
{
    public static IHtmlString Menu(this HtmlHelper htmlHelper)
    {
        var user = htmlHelper.ViewContext.HttpContext.User;
        if (user.IsInRole("Admin"))
        {
            return new HtmlString("Admin menu");
        }

        if (user.Identity.IsAuthenticated)
        {
            return new HtmlString("Normal menu");
        }

        return htmlHelper.ActionLink("Login", "Logon", "Account");
    }
}
0 голосов
/ 27 февраля 2012

Другая возможность будет выглядеть примерно так:

Определите базовый класс или интерфейс, скажем «UserState». Определите три класса, которые расширяют этот класс, каждый из которых представляет свое состояние пользователя, например UserAdmin, UserNormal, UserAnonymous.

Определите метод в вашей логике модели следующим образом: <pre></p> <pre><code>public void UserState GetUserState(User user) { if (user.IsInRole("Admin")) { return new UserAdmin(user); } if (user.Identity.IsAuthenticated) { return new UserNormal(user); } return new UserAnonymous(); }

Возможно, вы могли бы вызвать его из помощника html:

</p>

<pre><code>public static UserState GetUserState(this HtmlHelper html)
{
    var user = html.ViewContext.HttpContext.User;
    return MyModelLogic.GetUserState(user);
}

Затем в _layout.cshtml:

</p>

<pre><code>@{ var userState = Html.GetUserState(); }
@Html.DisplayFor(_ => userState)

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

0 голосов
/ 26 февраля 2012

Я не вижу серьезных проблем, если у вас есть проверки и авторизации на стороне сервера.

Имеющаяся у вас "логика" не является бизнес-логикой, поэтому допустимо иметь if операторов.

...