2015-11-10 3 views
1

Мне поручено в моем групповом проекте создать страницу профиля для всех пользователей. В нашей группе это происходит в ASP.net, а C# - как backend. Они уже что-то придумали для редактирования информации профиля. Страница выглядит так: I added side menuУсловно отображение элементов управления сервером

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

Мой ASP код выглядит следующим образом:

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Profile.aspx.cs" Inherits="User_Profile" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
    <!-- Should this page be visible to only this user? --> 
    <asp:Label ID="FirstNameLabel" runat="server" Text="First Name: "></asp:Label>&nbsp;&nbsp;&nbsp; 
    <asp:Label ID="YourFirstNameLabel" runat="server"></asp:Label> 
    <br /> 
    <asp:Label ID="ChangeFirstNameLabel" runat="server" Text="New First Name: "></asp:Label> 
    <asp:TextBox ID="FirstNameTextBox" runat="server"></asp:TextBox> 
    <br /><br /> 
    <asp:Label ID="LastNameLabel" runat="server" Text="Last Name: "></asp:Label>&nbsp;&nbsp;&nbsp; 
    <asp:Label ID="YourLastNameLabel" runat="server"></asp:Label> 
    <br /> 
    <asp:Label ID="ChangeLastNameLabel" runat="server" Text="New Last Name: "></asp:Label> 
    <asp:TextBox ID="LastNameTextBox" runat="server"></asp:TextBox> 
    <br /><br /> 
    <asp:Button ID="UpdateProfileButton" runat="server" OnClick="UpdateProfileButton_Click" Text="Update Profile" /> 
</asp:Content> 
<asp:Content ID="Content3" ContentPlaceHolderID="LeftContent" Runat="Server"> 
    <p style="height: 151px"> 
     <asp:ListBox 
      id="ProfileSideMenu" 
      AutoPostBack="true" 
      SelectionMode="single" 
      onSelectedIndexChanged="ProfileSideMenu_SelectionChanged" 
      runat="server"> 
      <asp:ListItem>Edit Profile</asp:ListItem> 
      <asp:ListItem>View Profile</asp:ListItem> 
      <asp:ListItem>View Friends</asp:ListItem> 
     </asp:ListBox> 
     <!-- This is dummy label and will be discarded when all is said and done --> 
     <asp:Label ID="DummyLabel" runat="server"></asp:Label> 
    </p> 
</asp:Content> 

Моя идея заключается в том, чтобы иметь серверные элементы управления для «Редактировать профиль» показать только тогда, когда «Редактировать профиль» определена (и в конечном счете, если loggedInUser является пользователь, чей профиль они В PHP это будет так же просто, как перезапись содержимого этого элемента (через echo). Однако я не знаю, как перезаписать серверные элементы управления. (Я не нашел документации о том, как это сделать.)

До сих пор мой код на C# выглядел так:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class User_Profile : System.Web.UI.Page 
{ 
    private static string EDIT_PROFILE = "Edit Profile", 
     VIEW_PROFILE = "View Profile", 
     VIEW_FRIENDS = "View Friends"; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     YourFirstNameLabel.Text = Profile.FirstName; 
     YourLastNameLabel.Text = Profile.LastName; 
    } 

    protected void UpdateProfileButton_Click(object sender, EventArgs e) 
    { 
     Profile.FirstName = Server.HtmlEncode(FirstNameTextBox.Text); 
     YourFirstNameLabel.Text = Profile.FirstName; 

     Profile.LastName = Server.HtmlEncode(LastNameTextBox.Text); 
     YourLastNameLabel.Text = Profile.LastName; 
    } 

    // to be called when selection changes in ProfileSideMenu 
    protected void ProfileSideMenu_SelectionChanged(object sender, EventArgs e) 
    { 
     // get the text of the option selected 
     string listSelection = ""; 
     if (ProfileSideMenu.SelectedIndex > -1) 
     { 
      listSelection = ProfileSideMenu.SelectedItem.Text; 
     } 
     // TODO: based on text, display the appropriate panel in #Content2 
     if (listSelection != "") 
     { 
      // For right now, just display it in DummyLabel 
      DummyLabel.Text = listSelection; 
      if (listSelection == User_Profile.EDIT_PROFILE) 
      { 
       // TODO: Show only elements for "Edit Profile" 
      } 
      if (listSelection == User_Profile.VIEW_PROFILE) 
      { 
       // TODO: Show only elements for "View Profile" 
      } 
      if (listSelection == User_Profile.VIEW_FRIENDS) 
      { 
       // TODO: Show only elements for "View Friends" 
      } 
     } 
     else 
     { 
      DummyLabel.Text = "No selection"; 
     } 
    } 
} 

Я всего Newb в ASP.net ....

+0

Если это не ясно, я хочу показать только соответствующие элементы в 'Content2' –

ответ

1

Есть много различных способов сделать это, но один вариант заключается в использовании MultiView управления. https://msdn.microsoft.com/en-us/library/ms227665.aspx

В основном вы определяете каждый раздел как View и показываете тот, который вы хотите.

<asp:MultiView ID="mvProfile" runat="server"> 
    <asp:View ID="viewEditProfile" runat="server"> 
     <h3>Edit profile</h3> 
     <%--- Edit profile controls ---%>   
    </asp:View> 
    <asp:View ID="viewViewProfile" runat="server"> 
     <h3>View profile</h3> 
     <%--- View profile controls ---%>      
    </asp:View> 
    <asp:View ID="viewViewFriends" runat="server"> 
     <h3>View Friends</h3> 
     <%--- View friends profile controls ---%>   
    </asp:View> 
</asp:MultiView> 

Далее вы настраиваете ваши, если заявления, чтобы изменить ActiveViewIndex

if (listSelection == User_Profile.EDIT_PROFILE) 
{ 
    // TODO: Show only elements for "Edit Profile" 
    mvProfile.ActiveViewIndex = 0; // 0 for the first view 
} 
if (listSelection == User_Profile.VIEW_PROFILE) 
{ 
    // TODO: Show only elements for "View Profile" 
    mvProfile.ActiveViewIndex = 1; // 1 for the second view 
} 
if (listSelection == User_Profile.VIEW_FRIENDS) 
{ 
    // TODO: Show only elements for "View Friends" 
    mvProfile.ActiveViewIndex = 2; // 2 for the third view 
} 

Есть довольно много способов справиться с этим, но это только один пример.

+0

. Я собирался поместить видимый атрибут на все эти, а затем переключиться на видимые, что было бы более полезным! Благодаря;/* Я собираюсь попробовать это! */ –

+0

РАБОТАЕТ! Спасибо за этот краш-курс! –

+0

У меня есть вопрос об этом: как следует обрабатывать [InvalidOperationException] при попытке установить «видимый» в любом из представлений во время выполнения (например, просмотр чужого профиля.aspx и код «скрывать» свой «профиль редактирования» "? [InvalidOperationException]: https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.view.visible(v=vs.110).aspx –

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