Условные строки


По сути я беру ряд флажков, с моей точки зрения, добавив их в словарьи выписыванием ключей любой флажок, который проверяется.

Я предполагаю, что там должен быть лучший способ делать это.

// We need to build a list of what the user would like more information on.

// First step is to add all of the Checkboxes to a `Dictionary<string, bool>`
Dictionary<string,bool> moreInfo = new Dictionary<string,bool>();
moreInfo.Add("Children's Programs", ccm.moreInfoChildren);
moreInfo.Add("Youth Programs",ccm.moreInfoYouth);
moreInfo.Add("Small Groups", ccm.moreInfoSmallGroups);
moreInfo.Add("Getting involved in Ministry",ccm.moreInfoMinistry);
moreInfo.Add("Receiving offering envelopes",ccm.moreInfoOfferingEnvelopes);
moreInfo.Add("Church Membership",ccm.moreInfoMembership);
moreInfo.Add("Baptism",ccm.moreInfoBaptism);
moreInfo.Add("Other (see notes)", ccm.moreInfoOther);


// Second step is to loop through the moreInfo `Dictionary<string, bool>` and build a string of results.
StringBuilder _moreInfo = new StringBuilder();
foreach (var info in moreInfo) {
    _moreInfo.Append(info.Value ? info.Key + ", " : "");
}

// Third step is to determin if the user wants any information. If they do, we add that information to the email.
if(!string.IsNullOrEmpty(_moreInfo.ToString()))
{
    builder.Append("I would like more information about ");
    builder.Append(_moreInfo.ToString());
}

Вот полный действия:

[HttpGet]
[AllowCrossSiteJsonAttribute]
public JsonpResult CommunicateCard(CommunicateCardModel ccm)
{
    if (ModelState.IsValid)
    {
        StringBuilder builder = new StringBuilder();

        // ccm.name is a required field, so we don't have to check if it's empty.
        builder.Append("Name: " + ccm.name + "\n");

        // If these properties are empty, we don't want to include them in the built string.
        builder.Append((!string.IsNullOrEmpty(ccm.address)) ? "Address: " + ccm.address + "\n" : null);
        builder.Append((!string.IsNullOrEmpty(ccm.city)) ? "City: " + ccm.city + "\n" : null);
        builder.Append((!string.IsNullOrEmpty(ccm.postalCode)) ? "Postal Code: " + ccm.postalCode + "\n" : null);
        builder.Append((!string.IsNullOrEmpty(ccm.phone)) ? "Phone Number: " + ccm.phone + "\n" : null);
        builder.Append((!string.IsNullOrEmpty(ccm.emailFrom)) ? "Email Address: " + ccm.emailFrom + "\n" : null);

        builder.Append("\n");

        builder.Append((!string.IsNullOrEmpty(ccm.information)) ? "Please " + ccm.information + "\n" : null);
        builder.Append((!string.IsNullOrEmpty(ccm.christianity)) ? "I " + ccm.christianity + "\n" : null);
        builder.Append((!string.IsNullOrEmpty(ccm.maritalStatus)) ? "I am " + ccm.maritalStatus + "\n" : null);

        builder.Append("\n");


        // pull together all of the checkboxes within the "Ministries" fieldset and generate a single string.
        var pairs = new[]
        {
            // Tuple.Create(string, bool)
            Tuple.Create("Children's Programs", ccm.moreInfoChildren),
            Tuple.Create("Youth Programs", ccm.moreInfoYouth),
            Tuple.Create("Small Groups", ccm.moreInfoSmallGroups),
            Tuple.Create("Getting involved in Ministry", ccm.moreInfoMinistry),
            Tuple.Create("Receiving offering envelopes", ccm.moreInfoOfferingEnvelopes),
            Tuple.Create("Church Membership", ccm.moreInfoMembership),
            Tuple.Create("Baptism", ccm.moreInfoBaptism),
            Tuple.Create("Other (see notes)", ccm.moreInfoOther),
        };

        var moreInfo = String.Join(", ", pairs.Where(pair => pair.Item2).Select(pair => pair.Item1));

        if (!String.IsNullOrEmpty(moreInfo))
        {
            builder.Append("I would like more information about ")
                   .Append(moreInfo);
        }

        builder.Append("\n");

        builder.Append((!string.IsNullOrEmpty(ccm.guestReason)) ? "I am visiting today because " + ccm.guestReason + "\n" : null);
        builder.Append((!string.IsNullOrEmpty(ccm.attendance)) ? "I am attending for my " + ccm.attendance + "\n" : null);

        builder.Append("\n");

        builder.Append((!string.IsNullOrEmpty(ccm.comments)) ?  ccm.comments : null);


        // initiate the email service and fire off an email
        EmailService email = new EmailService();
        email.to = ccm.emailTo;
        email.from = ccm.emailTo;
        email.replyTo = ccm.emailFrom;
        email.subject = ccm.messageSubject;
        email.messageBody = builder.ToString();

        bool sent = email.send();
        object result = null;

        // Send a system error message via JSON back to the app if the email fails.
        if (!sent)
        {
            result = new ErrorsModel { ErrorMessage = Server.GetLastError().Message };
        }

        // whether or not the email sent, we need to tell the app the result.
        return this.Jsonp(result, sent);
    }
    // The ModelState is invalid, Loop through the ModelState and send a JSON string listing all the errors.
    else 
    {
        List<ErrorsModel> Errors = new List<ErrorsModel>();
        foreach(ModelState modelState in ModelState.Values)
        {
            foreach (ModelError error in modelState.Errors)
            {
                Errors.Add(new ErrorsModel { ErrorMessage = error.ErrorMessage });
            };
        };

        return this.Jsonp(Errors, false);
    }
}


7268
9
задан 13 августа 2011 в 03:08 Источник Поделиться
Комментарии
2 ответа

Ваш метод имеет много повторений, чтобы построить свою строку, что часто приводит к ненужным звонки с помощью append(). Вы бы использовали , если заблокировать для каждого из них пишет, вместо того чтобы добавить значение null. Это также скрывает все звонки на IsNullOrEmpty() , которая представляет собой деталь не повторяется столько. Я хотел разбить это на несколько методов, по одному для каждой из действительных/недействительных случаях и одного, чтобы помочь с написанием строк. Написаны таким образом, у вас есть возможность использовать тот же трюк, чтобы быстро построить через запятую написать вашу содержание проще. Я думаю, вы согласитесь, что это гораздо легче читать.

[HttpGet]
[AllowCrossSiteJsonAttribute]
public JsonpResult CommunicateCard(CommunicateCardModel ccm)
{
return ModelState.IsValid
? CommunicateValidCard(ccm)
: CommunicateInvalidCard(ccm);
}

StringBuilder AppendNonWhiteField(StringBuilder builder, string format, string field)
{
if (!String.IsNullOrWhiteSpace(field))
{
builder.AppendFormat(format, field);
}
return builder;
}

JsonpResult CommunicateValidCard(CommunicateCardModel ccm)
{
StringBuilder builder = new StringBuilder();

// ccm.name is a required field, so we don't have to check if it's empty.
builder.Append("Name: " + ccm.name + "\n");

// If these properties are empty, we don't want to include them in the built string.
AppendNonWhiteField(builder, "Address: {0}\n", ccm.address);
AppendNonWhiteField(builder, "City: {0}\n", ccm.city);
AppendNonWhiteField(builder, "Postal Code: {0}\n", ccm.postalCode);
AppendNonWhiteField(builder, "Phone Number: {0}\n", ccm.phone);
AppendNonWhiteField(builder, "Email Address: {0}\n", ccm.emailFrom);
builder.AppendLine();

AppendNonWhiteField(builder, "Please {0}\n", ccm.information);
AppendNonWhiteField(builder, "I {0}\n", ccm.christianity);
AppendNonWhiteField(builder, "I am {0}\n", ccm.maritalStatus);
builder.AppendLine();

// pull together all of the checkboxes within the "Ministries" fieldset and generate a single string.
var pairs = new[]
{
// Tuple.Create(string, bool)
Tuple.Create("Children's Programs", ccm.moreInfoChildren),
Tuple.Create("Youth Programs", ccm.moreInfoYouth),
Tuple.Create("Small Groups", ccm.moreInfoSmallGroups),
Tuple.Create("Getting involved in Ministry", ccm.moreInfoMinistry),
Tuple.Create("Receiving offering envelopes", ccm.moreInfoOfferingEnvelopes),
Tuple.Create("Church Membership", ccm.moreInfoMembership),
Tuple.Create("Baptism", ccm.moreInfoBaptism),
Tuple.Create("Other (see notes)", ccm.moreInfoOther),
};
var moreInfo = String.Join(", ", pairs.Where(pair => pair.Item2).Select(pair => pair.Item1));
AppendNonWhiteField(builder, "I would like more information about {0}\n", moreInfo);

AppendNonWhiteField(builder, "I am visiting today because {0}\n", ccm.guestReason);
AppendNonWhiteField(builder, "I am attending for my {0}\n", ccm.attendance);
builder.AppendLine();

AppendNonWhiteField(builder, "{0}", ccm.comments);

// initiate the email service and fire off an email
EmailService email = new EmailService();
email.to = ccm.emailTo;
email.from = ccm.emailTo;
email.replyTo = ccm.emailFrom;
email.subject = ccm.messageSubject;
email.messageBody = builder.ToString();

bool sent = email.send();
object result = null;

// Send a system error message via JSON back to the app if the email fails.
if (!sent)
{
result = new ErrorsModel { ErrorMessage = Server.GetLastError().Message };
}

// whether or not the email sent, we need to tell the app the result.
return this.Jsonp(result, sent);
}

JsonpResult CommunicateInvalidCard(CommunicateCardModel ccm)
{
// The ModelState is invalid, Loop through the ModelState and send a JSON string listing all the errors.
var errors = ModelState.Values
.SelectMany(modelState =>
modelState.Errors
.Select(error => new ErrorsModel { ErrorMessage = error.ErrorMessage }))
.ToList();
return this.Jsonp(errors, false);
}

6
ответ дан 13 августа 2011 в 04:08 Источник Поделиться

Не зная, Если вам нужен словарь для последующего использования, можно сделать 2-ой шаг лучше (и удалить трейлинг ", " что бы вам добавили) с помощью строки.Присоединяйтесь к лямбда (не забудьте добавить в систему.LINQ в использовании, если он не существует):

// Second step is to loop through the moreInfo `Dictionary<string, bool>` and build a string of results.
string _moreInfo = String.Join(", ", moreInfo.Where(m => m.Value).Select(m => m.Key).ToArray());

Тогда вы можете также бросить .ToString() на Проверить IsNullOrEmpty из _moreInfo и добавление _moreInfo в шаге 3.

2
ответ дан 13 августа 2011 в 03:08 Источник Поделиться