2016-04-27 2 views
1

Я выложу свой просмотр и контроллер ниже., делая мой код контроллера более чистым и менее повторяющимся

Мне интересно, есть ли лучший способ сделать это, поэтому мне не нужно иметь того же кода 4 раза, так как это довольно много, чтобы замять мой контроллер, и лучше было бы сделать он более многоразовый, вместо того, чтобы повторять и изменять небольшие части.

Вот как это работает: пользователь выбирает опцию, из FirstName, Email или PostCode, а затем можно выбрать таймфрейм, как показано ниже. Сделать это для каждого будет простой копией/вставкой и изменением, но я хочу использовать меньше кода, если это возможно.

Вот мой контроллер заявление:

//if a user choose the radio button option as FirstName 
if (option == "FirstName") 
{ 
    if (date == "day") 
    { 
     DateTime today = DateTime.Now.AddDays(-1); 
     return View(db.Orders.Where(x => x.FirstName.StartsWith(search) && x.OrderDate >= today || search == null).ToList()); 
    } 
    if (date == "week") 
    { 
     DateTime today = DateTime.Now.AddDays(-7); 
     return View(db.Orders.Where(x => x.FirstName.StartsWith(search) && x.OrderDate >= today || search == null).ToList()); 
    } 
    if (date == "month") 
    { 
     DateTime today = DateTime.Now.AddMonths(-1); 
     return View(db.Orders.Where(x => x.FirstName.StartsWith(search) && x.OrderDate >= today || search == null).ToList()); 
    } 
    if (date == "year") 
    { 
     DateTime today = DateTime.Now.AddYears(-1); 
     return View(db.Orders.Where(x => x.FirstName.StartsWith(search) && x.OrderDate >= today || search == null).ToList()); 
    } 
    else 
    { return View(db.Orders.Where(x => x.FirstName.StartsWith(search) || search == null).ToList()); 
} 

Мое мнение;

@using (Html.BeginForm("Index", "EditOrders", FormMethod.Get)) 
{ 
    //the following are search options 

    <b> Search for: </b>@Html.RadioButton("option", "FirstName") <text>First Name</text> @Html.RadioButton("option", "PostalCode") <text> Post-Code </text> 
    @Html.RadioButton("option", "Username")<text>Email-Address</text> @Html.TextBox("search") 
    <text>Orders Made </text><select id="date" name="date"> 
     <option value="none">All Orders</option> 
     <option value="day">In the last day</option> 
     <option value="week">In the last week</option> 
     <option value="month">In the last month</option> 
     <option value="year">In the last year</option> 
    </select> 
    <input type="submit" name="submit" value="Search" /> 
} 
+2

Это касается реализации Factory pattern; ваш контроллер будет выглядеть просто двумя строками кода, но эти условия будут присутствовать в вашем классе Factory, который возвращает нужный объект – techspider

+0

, один из вариантов - изменить ваши значения на фактические дни; для ex: вместо «day», измените его на «1»; вместо «недели», измените его на «7»; используйте это значение для вычитания дней в контроллере – techspider

+0

Используйте IQueryable и добавьте каждый параметр (имя, адрес электронной почты, почтовый индекс, дату) отдельно. Дополнительная информация: http://stackoverflow.com/questions/22122618/selecting-data-using-entity-framework-based-on-optional-search-parameters –

ответ

2

Как об изменении фактических значений в форме

@using (Html.BeginForm("Index", "EditOrders", FormMethod.Get)) 
{ 
    //the following are search options 
<b> Search for: </b>@Html.RadioButton("option", "FirstName") <text>First Name</text> @Html.RadioButton("option", "PostalCode") <text> Post-Code </text> 
@Html.RadioButton("option", "Username")<text>Email-Address</text> @Html.TextBox("search") 
<text>Orders Made </text><select id="date" name="date"> 
    <option value="0">All Orders</option> 
    <option value="1">In the last day</option> 
    <option value="7">In the last week</option> 
    <option value="30">In the last month</option> 
    <option value="365">In the last year</option> 
    </select> 
    <input type="submit" name="submit" value="Search" /> 
} 

код контроллера

if (option == "FirstName") 
{ 
    var days = Convert.ToInt32(date) * -1; 

    if(days > 0) 
    { 
     DateTime today = DateTime.Now.AddDays(days); 
     return View(db.Orders.Where(x => x.FirstName.StartsWith(search) && x.OrderDate >= today || search == null).ToList()); 
    } 
    else 
    { 
     return View(db.Orders.Where(x => x.FirstName.StartsWith(search) || search == null).ToList()); 
    } 
} 
+1

365 разрывается на високосный год, 30 будут ломаться в течение нескольких месяцев (некоторые 31, другие 30, февраль могут иметь 28 или 29). Кроме того, ваше слово сломано '(search) && || поиск' – user1666620

+0

@ user1666620 - это правда; это работает только в том случае, если он не обеспокоен этим; – techspider

+0

Im тестирует это сейчас, если он работает, это будет мой предпочтительный метод! Не то, что беспокоило високосные годы и т. Д. Вернемся к вам через мгновение, спасибо @techspider –

0

Это тонкая грань между тем, что должно быть на виду и что должно быть на контроллере, ха-ха. Я голосую, чтобы очистить код, а вместо этого изменить код контроллера. Вы можете использовать шаблон factory, и если у вас есть время, взгляните на понятные понятия кода. На MVA есть хорошие уроки. Опять же, это личное.

Лучшее!

Смежные вопросы