【问题标题】:MVC 3/C# Can't use variables that have been declared inside if statementsMVC 3/C# 不能使用已在 if 语句中声明的变量
【发布时间】:2012-11-17 08:41:09
【问题描述】:

我正在尝试在我的控制器中编写代码,该代码在运行时将创建一堆变量,然后使用具有占位符以包含变量的模板发送电子邮件。但是,它将用户帐户中的信息分配给变量,如果用户尚未填写该信息,它将崩溃。作为一种解决方法,我在 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");

【问题讨论】:

  • 这看起来比它可能需要的复杂得多。这里string.Format的目的是什么?
  • 说实话,很可能是这样。我在这方面的编程语言非常有限,我只是让它以任何我可以的方式工作。如果您对提高效率有任何建议,我们将不胜感激。
  • 所有(嗯,大部分)if/assigns 在语义上等同于仅分配值。如果值为 null,则变量将具有默认值(字符串为 null)。如果该值是一个字符串,那么string.Format(s) =likely= s(除了string.Format 可以抛出异常并且转义将被删除),所以该操作没有任何用处。

标签: c# model-view-controller


【解决方案1】:

每个变量仅在创建它的块的生命周期内存在。当每个 if 块结束时,它们会立即消失。解决方案是先声明所有变量,然后根据需要进行赋值。

这是try/catch 块的常见烦恼之一。任何以后可能有用的东西都需要在try 之前声明。如果构造函数可能抛出异常,那么它应该在 try 块内。

【讨论】:

  • 阅读您的回答后,我只花了五分钟就修复了一个我已经工作了几个小时的错误!非常感谢!
  • 很高兴我能帮上忙。对于string 以外的数据类型,请查看Nullable<T>。困惑的下一步是意识到 C# null 与数据库 DBNull 没有太大关系。
【解决方案2】:

因为您在 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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多