У меня есть представление для отображения списка объектов. Пользователь может отредактировать, удалить или создать новые объекты, но согласно их полномочиям они могут или не могут быть позволены сделать часть этого действия.
У меня есть требование для отображения только действий, которые текущему пользователю разрешают сделать, но я не хочу создавать помехи представлениям авторизацией если-else's
Презирайте того, что он очень общее требование, я не могу найти реальный удовлетворительный способ сделать его.
Мой лучший подход до сих пор должен предоставить перегрузку Html.ActionLink
дополнительный метод, который берет разрешение попросить, но там будет более сложными сценариями, как сокрытие всех блоков HTML или переключения текстового поля для label+hidden.
Существует ли лучший способ сделать это?
Один из примеров, который я могу придумать, - это вызвать Html.RenderAction (ссылка: http://msdn.microsoft.com/en-us/library/ee703490.aspx ), а затем передать ссылку, которую вы хотите использовать в качестве значения маршрута к методу действия (она будет отображаться как параметр вашего действия). Поскольку это RenderAction, вы можете вернуться к процессу контроллера и, таким образом, вы можете сделать так, чтобы он отображал любое представление или данные, которые вы хотите, в зависимости от состояния пользователя.
Пример:
<% Html.RenderAction("Permissions" /* Controller */, "PermissionLink", new { Url = "Admin.aspx" }); %>
И ваш контроллер будет иметь что-то вроде:
public ActionResult PermissionsLink (string url)
{
// Do Whatever kind of Authentication you want here, Session is available, etc
if(authenticated)
return View("Link");
else
return View("Blank");
}
У нас была такая же проблема. В итоге мы написали множество вспомогательных методов, а в случаях, когда требовалось много вывода html, мы помещали их в частичные представления.
Не будет ли проще создать несколько представлений с различными элементами управления в зависимости от того, какие значения может изменять пользователь, а затем вернуть правильное представление на основе прав доступа пользователя?
Представления должны быть для представляя только информацию, в них действительно не должно быть никакой условной логики или, по крайней мере, минимума.
Я всегда обнаруживал, что когда я доходил до точки, когда мне было трудно разобраться в ситуации, подобной вашей, лучшим решением всегда было вернуться к контроллеру и проверить, что я передаю вид в первую очередь.
К тому времени, когда View вызывается для выполнения своей работы, все важные «решения» должны быть уже приняты.