2012-02-26 2 views
0

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

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

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

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

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

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

ответ

2

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

Я не согласен. Для меня такая логика вполне приемлема в представлении. Вы могли бы написать помощник 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

Конечно, нет, но лично мне не нравятся конструкции типа if-else (if-else), поскольку я считаю, что это представление берет на себя ответственность за обязанности, которые не следует принимать. Я скорее подумал о каком-то помощнике, который выберет правильный PartialView из возможных 3 - что вы думаете? – deha

0

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

«Логика» у вас там нет бизнес-логики, поэтому допустимо иметь if заявления.

0

Другой возможностью было бы что-то вроде этого:

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

ли метод, определенный в вашей логике модели, как так:

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 помощника:

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

Затем в _layout.cshtml:

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

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

Смежные вопросы