Задать значение строки в классе Stati c - PullRequest
2 голосов
/ 03 марта 2020

Я пытаюсь установить значение строки в классе c, нажав кнопку на странице .aspx. Я не понимаю, почему значение всегда равно нулю.

Вот код класса stati c:

public static class XeroApiHelper
{
    private static ApplicationSettings _applicationSettings;
    public static string WebUrl { get; set; }

    static XeroApiHelper()
    {
        // Refer to README.md for details

        string callbackUrl = WebUrl + "/xero/xeroconnection.aspx";

Строка, которую я пытаюсь установить, - WebUrl.

Вот код в событии щелчка:

protected void btnXeroConnect_Click(object sender, ImageClickEventArgs e)
{
    string weburl = Request.Url.GetLeftPart(UriPartial.Authority);
    XeroApiHelper.WebUrl = weburl;
    _user = XeroApiHelper.User();
    _authenticator = XeroApiHelper.MvcAuthenticator();
    var authorizeUrl = _authenticator.GetRequestTokenAuthorizeUrl(_user.Name);
    Response.Redirect(authorizeUrl);
}

Любая помощь с благодарностью.

1 Ответ

1 голос
/ 03 марта 2020

Это из-за static constructor. Конструктор вызывается до обращения к любому члену stati c. Это означает, что конструктор был вызван до выполнения строки XeroApiHelper.WebUrl = weburl;. Это устанавливает null значение в callbackUrl

. Вызывается конструктор stati c, который автоматически инициализирует класс перед созданием первого экземпляра или ссылками на любые члены stati c. Конструктор stati c запускается перед конструктором экземпляра. Конструктор stati c типа вызывается, когда вызывается статический метод, назначенный событию или делегату, а не когда он назначен. Если инициализаторы переменных поля stati c присутствуют в классе конструктора stati c, они будут выполняться в текстовом порядке, в котором они появляются в объявлении класса, непосредственно перед выполнением конструктора stati c.

Stati c конструкторы

Отредактировано: для включения возможного решения

Переместить код из static конструктор для set вызов WebUrl как:

private static string _WebUrl;
public static string WebUrl
{
    get { return _WebUrl; }
    set
    {
        _WebUrl = value;
        string  callbackUrl = _WebUrl + "/xero/xeroconnection.aspx";
        // move rest of code from constructore here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...