Используйте частичное представление, как есть, но разные представления в зависимости от статуса входа в систему. Вернуть одно представление для анонимных пользователей с формой входа / ланком на страницу регистрации и второе представление для зарегистрированных пользователей.
Частичные представления могут иметь свои собственные модели, которые не должны наследоваться от модели основного вида.
Наследование моделей может вызвать проблемы позже (это делает использование html.EditForModel()
или .DisplayForModel()
сложным, так как они также отрисовывают общие поля основного вида).
Да, и вообще, для представления плохо полагаться на что-либо вне модели - ваш тест на Request.IsAuthenticated
может пока подойти, но если вы хотите быть абсолютно корректным, у вас должно быть свойство model.IsAuthenticated
который установлен действием. Тем не менее, переключение взглядов полностью избавит от этой проблемы.
Редактировать: Последнее улучшение. В таких строках:
Welcome <b><%= Html.Encode(Page.User.Identity.Name) %></b>!
Вместо этого:
Welcome <b><%: Page.User.Identity.Name %></b>!
На самом деле еще лучше было бы поразить только модель:
Welcome <b><%: model.Username %></b>!
(обратите внимание на <%:
, а не <%=
). Эта форма тега указывает, что содержимое должно быть в кодировке HTML. Еще лучше то, что если он встречает string
, он его кодирует. Если он встречает HTMLString
, он не будет. Все функции .Net MVC возвращают строку или строку HTML в зависимости от ситуации, поэтому вы можете сделать это:
<%: html.EditFor(x => x.fieldname) %>
<%: model.somefield %>
Первый НЕ будет кодироваться в формате html, так как EditFor()
возвращает HTMLString
. Второй будет закодирован (если somefield
является стандартной строкой)
Это сделает ваш код более аккуратным и надежным. Вы также можете использовать это для динамической генерации HTML, если вам нужно, и закодировать его / не так, как нужно. Например, у нас есть несколько вспомогательных функций для обработки, включая CSS / JS. Они возвращают HTMLStrings ...
<%: Helper.IncludeCSS("SomeCSS.css") %>