0

実行時に一連の変数を作成し、変数を含めるプレースホルダーを持つテンプレートを使用して電子メールを送信するコードをコントローラーに記述しようとしています。ただし、ユーザー アカウントから変数に情報を割り当てており、ユーザーがまだその情報を入力していない場合はクラッシュします。回避策として、最初に null でないことを確認する if ステートメント内で宣言しました。しかし、それらを電子メールテンプレートに渡そうとすると、変数が存在しないことがわかります。if ステートメントを削除すると、再び機能します。理由はありますか?

コードは以下...

if (UserContext != null && UserContext.Account != null)
        {

            if (UserContext.UserName != null)
            { string UserName = string.Format(UserContext.UserName); }

            if (UserContext.EmailAddress != null)
            { string EmailAddress = string.Format(UserContext.EmailAddress); }

            if (UserContext.Account.PrimaryContactFirstName != null)
            { string FirstName = string.Format(UserContext.Account.PrimaryContactFirstName); }

            if (UserContext.Account.PrimaryContactLastName != null)
            { string LastName = string.Format(UserContext.Account.PrimaryContactLastName); }

            if (UserContext.Account.PrimaryContactPhoneNumber != null)
            { string PhoneNumber = string.Format(UserContext.Account.PrimaryContactPhoneNumber); }

            if (UserContext.Account.HeadquartersAddressLine1 != null)
            {
                string AddressLine1 = string.Format(UserContext.Account.HeadquartersAddressLine1);

                if (UserContext.Account.HeadquartersAddressLine2 != null)
                { string AddressLine2 = string.Format(UserContext.Account.HeadquartersAddressLine2); }
            }

            if (UserContext.Account.HeadquartersCity != null)
            { string City = string.Format(UserContext.Account.HeadquartersCity); }

            if (UserContext.Account.HeadquartersState != null)
            { string State = string.Format(UserContext.Account.HeadquartersState); }

            if (UserContext.Account.HeadquartersZip != null)
            { string ZipCode = string.Format(UserContext.Account.HeadquartersZip); }

            if (UserContext.Account.Name != null)
            { string Name = string.Format(UserContext.Account.Name); }

            string body = string.Format(Resources.ContactUsLoggedInEmailTemplate, model.FirstName, model.LastName, model.PhoneNumber, model.Email, model.ReasonForContact, model.Message, UserName, EmailAddress, FirstName, LastName, PhoneNumber, AddressLine1, AddressLine2, City, State, ZipCode, Name);

            string subject = string.Format("Web Submit: {0}", model.ReasonForContact);

            EmailHelper.SendEmail("support@website.com", subject, body, true);

        }
        if (UserContext == null)
        {
            string body = string.Format(Resources.ContactUsEmailTemplate, model.FirstName, model.LastName, model.PhoneNumber, model.Email, model.ReasonForContact, model.Message);

            string subject = string.Format("Web Submit: {0}", model.ReasonForContact);

            EmailHelper.SendEmail("support@website.com", subject, body, true);
        }

        return RedirectToAction("ContactConfirmation");
4

2 に答える 2

3

各変数は、それが作成されたブロックの存続期間中のみ存在します。if各ブロックが終了すると、それらは即座に消えます。解決策は、最初にすべての変数を宣言してから、必要に応じて値を割り当てることです。

これはtry/catchブロックの一般的な煩わしさの 1 つです。後で役立つ可能性のあるものはすべて、 の前に宣言する必要がありますtry。コンストラクターが例外をスローする可能性がある場合は、tryブロック内にある必要があります。

于 2012-06-11T02:49:15.077 に答える
1

If ステートメントで変数を宣言しているため、If ステートメントが完了すると変数は消えます。先頭で変数を宣言すると (例: string body;, if チェックの前に)、メールにそれらを渡すことができるはずです。

string UserName;
string EmailAddress;
string FirstName;
....
if (UserContext != null && UserContext.Account != null)
        {

            if (UserContext.UserName != null)
            { UserName = string.Format(UserContext.UserName); }

            if (UserContext.EmailAddress != null)
            { EmailAddress = string.Format(UserContext.EmailAddress); }

            if (UserContext.Account.PrimaryContactFirstName != null)
            { FirstName = string.Format(UserContext.Account.PrimaryContactFirstName); }

            if (UserContext.Account.PrimaryContactLastName != null)
            { LastName = string.Format(UserContext.Account.PrimaryContactLastName); }

            if (UserContext.Account.PrimaryContactPhoneNumber != null)
            { PhoneNumber = string.Format(UserContext.Account.PrimaryContactPhoneNumber); }

            if (UserContext.Account.HeadquartersAddressLine1 != null)
            {
                AddressLine1 = string.Format(UserContext.Account.HeadquartersAddressLine1);

                if (UserContext.Account.HeadquartersAddressLine2 != null)
                { AddressLine2 = string.Format(UserContext.Account.HeadquartersAddressLine2); }
            }

            if (UserContext.Account.HeadquartersCity != null)
            { City = string.Format(UserContext.Account.HeadquartersCity); }

            if (UserContext.Account.HeadquartersState != null)
            { State = string.Format(UserContext.Account.HeadquartersState); }

            if (UserContext.Account.HeadquartersZip != null)
            { ZipCode = string.Format(UserContext.Account.HeadquartersZip); }

            if (UserContext.Account.Name != null)
            { Name = string.Format(UserContext.Account.Name); }

            string body = string.Format(Resources.ContactUsLoggedInEmailTemplate, model.FirstName, model.LastName, model.PhoneNumber, model.Email, model.ReasonForContact, model.Message, UserName, EmailAddress, FirstName, LastName, PhoneNumber, AddressLine1, AddressLine2, City, State, ZipCode, Name);

            string subject = string.Format("Web Submit: {0}", model.ReasonForContact);

            EmailHelper.SendEmail("support@website.com", subject, body, true);

        }
        if (UserContext == null)
        {
            body = string.Format(Resources.ContactUsEmailTemplate, model.FirstName, model.LastName, model.PhoneNumber, model.Email, model.ReasonForContact, model.Message);

            subject = string.Format("Web Submit: {0}", model.ReasonForContact);

            EmailHelper.SendEmail("support@website.com", subject, body, true);
        }

        return RedirectToAction("ContactConfirmation");
于 2012-06-11T02:50:08.817 に答える