С чего начать. К сожалению, несмотря на другие комментарии, вы на самом деле не пишете что-то специфичное для веб-форм. Так что переход на MVC волшебным образом не сделает ваш код лучше.
1 Не используйте собственную аутентификацию: используйте аутентификацию с помощью форм , если у вас нет веских причин не делать этого. При использовании проверки подлинности с помощью форм вам не нужно писать код на каждой странице, чтобы проверить, что вы вошли в систему. Фреймворк сделает это за вас.
2 Научитесь использовать серверные элементы управления :
Также, как пишут другие, вы не должны писать html в коде, особенно для чего-то такого тривиального. Веб-формы также не заставляют вас делать это.
<!-- this is in MyPage.aspx -->
<asp:HyperLink id="viewLink" runat="server" />
// in the code-behind file MyPage.aspx.cs
viewLink.NavigateUrl = "~/viewdocument.aspx";
viewLink.Text = Controller.Title;
Если вы собираетесь придерживаться веб-форм, вам необходимо ознакомиться с жизненным циклом ASP.Net Page
3 Ваш код нуждается в рефакторинге. Неважно, веб-формы, php или MVC. Вот несколько основных рефакторингов, и ни один из них не является специфичным для .net. Я пройдусь по ним небольшими шагами.
// this may be a good candidate for an extension method
int? ConvertNullable(string nullableInt) {
if( string.IsNullOrEmpty(nullableInt) )
return null;
int value;
if( Int32.TryParse(nullableInt, out value) )
return value;
return null;
}
, который затем позволяет писать.
int genchap? = ConvertNullable(Request.QueryString["gchap"]);
int qualchap? = ConvertNullable(Request.QueryString["qualchap"]);
int docId? = ConvertNullable(Request.QueryString["did"]);
FillQualityList(genchap,qualchap);
SetChapterTitle(genchap,qualchap);
DetermineView(docId);
но передача большого количества примитивов - это хлопотно и подвержено ошибкам, поэтому иногда мы создаем небольшой класс для инкапсуляции данных, в данном случае это информация об инициализации страницы.
class ChapterView
{
public int? GenChapter {get; set;}
public int? QualChapter {get; set;}
public int? DocumentId {get; set;}
}
private ChapterView GetChapterView()
{
return new ChapterView
{
GenChapter = ConvertNullable(Request.QueryString["gchap"]),
QualChapter = ConvertNullable(Request.QueryString["qualchap"]),
DocumentId = ConvertNullable(Request.QueryString["did"])
}
}
Обратите внимание, что я понятия не имею, что такое GenChap и QualChap, но они немного лаконичны, и вы можете выполнить рефакторинг, чтобы сделать их более читабельными в коде. Но даже без лучших имен у нас теперь есть более читаемый код.
ChapterView chapterView = GetChapterView();
FillQualityList(chapterView);
SetChapterTitle(chapterView);
DetermineView(chapterView);
И, наконец, вы можете решить, что вам на самом деле не нужно вызывать его каждый раз, когда страница выполняется для чтения из строки запроса. Если вы читали на Asp.Net Page LifeCycle , вы знаете, что события могут измениться GenChapter
или что-то еще, что влияет на отображение страницы. Возможно, вам будет удобнее настроить представление в PreRender, чем вызывать FillQualityList снова и снова.
ChapterView chapterView;
Page_Load()
{
if( !IsPostback )
{
ChapterView chapterView = GetChapterView();
}
else
{
chapterView = (ChapterView) ViewState["chapterview"];
}
}
NextChapter_Click()
{
chaperView.NextChapter();
}
Page_PreRender()
{
FillQualityList(chapterView);
SetChapterTitle(chapterView);
DetermineView(chapterView);}
// make sure class is marked [Serializable]
ViewState["chapterview"] = chapterView;
}