2016-12-02 1 views
2

При попытке привязать модель к представлению я получаю ошибку 404. ActionResult называется SortDesc, но представление является стандартным представлением «Index». Я понимаю, что это не загрузка, потому что теперь есть вид, называемый «SortDesc». Однако у меня есть две кнопки для сортировки данных по возрастанию и одна для сортировки данных, следовательно, две отдельные функции. Я просто не уверен, какое лучшее решение будет здесь, либо продолжить с двумя отдельными функциями, и каким-то образом перейти в правильное представление для загрузки или создать новую единую функцию HttpPost в индексе, которая будет знать, какая кнопка была нажата и сортировать соответственно. Вот код, который я до сих пор:Проблемы с привязной моделью для просмотра

Модели:

public class NumberSetList 
{ 
    public int NumberSetListId { get; set; } 
    public List<NumberList> Numbers { get; set; } 

    public string SortOrder { get; set; } 
} 

public class NumberList 
{ 
    public int NumberListId { get; set; } 
    public int Number1 { get; set; } 
    public int Number2 { get; set; } 
    public int Number3 { get; set; } 
    public int Number4 { get; set; } 
    public int Number5 { get; set; } 
    public string SortOrder { get; set; } 
} 

Razor:

@{ 
    ViewBag.Title = "csi media web test"; 
} 

<div class="jumbotron"> 
    <h1>csi media web test</h1> 
    <p class="lead">Liane Stevenson</p> 
</div> 

<div class="row"> 
    <div class="col-md-12"> 
     <div class="panel panel-info"> 
      <div class="panel-heading"><i class="glyphicon glyphicon-arrow-right"></i> Enter Your Four Numbers</div> 
      <div class="panel-body"> 
       <form class="form-inline"> 
        <div class="col-md-9"> 
         <div class="form-group"> 
          <label class="sr-only" for="number1">1st Number</label> 
          <input type="number" class="form-control" id="number1" name="Number1" placeholder="#1"> 
         </div> 
         <div class="form-group"> 
          <label class="sr-only" for="number2">2nd Number</label> 
          <input type="number" class="form-control" id="number2" name="Number2" placeholder="#2"> 
         </div> 
         <div class="form-group"> 
          <label class="sr-only" for="number3">3rd Number</label> 
          <input type="number" class="form-control" id="number3" name="Number3" placeholder="#3"> 
         </div> 
         <div class="form-group"> 
          <label class="sr-only" for="number4">4th Number</label> 
          <input type="number" class="form-control" id="number4" name="Number4" placeholder="#4"> 
         </div> 
        </div> 
        <div class="col-md-3 text-right"> 
         <a class="btn btn-default" href="@Url.Action("SortDesc", "Home")"><i class="glyphicon glyphicon-arrow-down"></i> Sort Desc</a> 
         <a class="btn btn-default" href="@Url.Action("SortAsc", "Home")"><i class="glyphicon glyphicon-arrow-down"></i> Sort Asc</a> 
        </div> 
       </form> 
       <p> 
        @if (Model != null) 
        { 
         foreach (int number in Model.Numbers) 
         { 
          <span class="label label-info">@number</span> 
         } 
        } 
       </p> 
      </div> 
     </div> 
    </div> 
</div> 

Главная Контроллер:

public ActionResult Index() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult SortDesc([Bind(Include = "Number1, Number2, Number3, Number4")] NumberSetList model) 
{ 

    if (!ModelState.IsValid) 
    { 
     return View(); 
    } 
    else 
    { 
     NumberSetList list = new NumberSetList(); 
     List<int> numbers = new List<int>(); 
     numbers.Add(model.Number1); 
     numbers.Add(model.Number2); 
     numbers.Add(model.Number3); 
     numbers.Add(model.Number4); 
     numbers.OrderByDescending(i => i); 
     list.SortOrder = "Desc"; 
     return View(list); 
    } 

} 
+0

В действии, переменная 'numbers' не назначен ни к чему. Как будет воспринято мнение об этом? Вам нужно установить 'list.numbers = число,' – Nkosi

+0

Это выдает ошибку: Серьезность \t \t Код Описание \t \t Project File \t \t Line Подавление Государственный Ошибка \t \t CS0029 Не удается неявно преобразовать тип «System.Collections.Generic.List 'to' System.Collections.Generic.List '\t CSIMediaASPTest –

+0

Мой плохой. да, царапины. пропустил «Список ' – Nkosi

ответ

1

Попробуйте

public class NumberSetList { 
    public int NumberSetListId { get; set; } 
    public List<NumberSetItem> Numbers { get; set; } 
    public string SortOrder { get; set; } 
} 

public class NumberSetItem { 
    public int Value { get; set; } 
} 

, используйте for цикл, чтобы создать входы для номеров

@using (Html.BeginForm()) { 
    <div class="col-md-9"> 
     <div class="form-group"> 
      @if (Model != null && Model.Numbers != null) { 
       @for (int i = 0; i < Model.Numbers.Count; i++) { 
        <div class="form-group"> 
         @Html.LabelFor(m => m.Numbers[i].Value, "Number " + (i+1).ToString()) 
         @Html.TextBoxFor(m => m.Numbers[i].Value, new { @class = "form-control" }) 
        </div> 
       } 
       <div class="col-md-3 text-right"> 
        <input id="SortOrder" value="Desc" type="button" class="btn btn-default"><i class="glyphicon glyphicon-arrow-down"></i> Sort Desc</input> 
        <input id="SortOrder" value="Asc" type="button" class="btn btn-default"><i class="glyphicon glyphicon-arrow-down"></i> Sort Asc</input> 
       </div> 
      } 
     </div> 
    </div> 
} 

И в представлении

[HttpPost] 
public ActionResult Index(NumberSetList model) { 
    if (!ModelState.IsValid) { 
     return View(); 
    } else { 
     var numbers = model.SortOrder == "Desc" ? 
      model.Numbers.OrderByDescending(n => n.Value) : 
      model.Numbers.OrderBy(n => n.Value); 
     model.Numbers = numbers.ToList(); 
     return View(model); 
    } 
} 
+0

Генерирует ошибку: Дерево выражений может не содержать динамическую операцию - thats on 'm.Numbers [i]' –

+0

Очень близко сейчас - не проходит в модели - я установил значения для модели в ActionResult Index (), но они не переносятся на SortDesc –

+0

Это потому, что ссылки делают GET, а не POST, который они не могут. Обновите форму, чтобы указать на действие '@using (Html.BeginForm())' и включить сортировку как свойство для модели вместо двух отдельных действий. – Nkosi

1

Вы можете решить проблему с помощью различных методов ,

Передайте имя вида в View метод как это:

return View("Index", list); 

Метод View имеет много перегрузок, и вы можете увидеть их все here. Приятно познакомиться с перегрузками для сценариев, подобных тем, с которыми вы сталкиваетесь.

Если ваше представление не находится в той же папке, что и действие, вам нужно будет передать путь для представления вместо имени.

Другой способ состоит в том, чтобы иметь одно действие, и вы также можете вызвать этот один Индекс, но этот будет принимать модель в качестве аргумента. Ваша модель может иметь номера и перечисления для сортировки: Desc, Asc. В вашем методе действий вы можете анализировать модель и делать все, что необходимо.

Подход с моделью является тем, который я предпочитаю.

EDIT

Я только что заметил, у вас есть эта строка кода в вашей точки зрения:

<a class="btn btn-default" href="@Url.Action("SortDesc", "Home")"><i class="glyphicon glyphicon-arrow-down"></i> Sort Desc</a> 

Это вызовет HTTP GET и поэтому он не ударит ваш метод SortDsc действий. Удалите POST из вашего метода действий или используйте технику сообщений (Form), чтобы применить ваш метод действий с помощью POST.

EDIT 2

Честно говоря, что вы делаете, это гораздо проще, чем вы делаете это. Во-первых, когда вы используете Url.Actio, вы ничего не передаете своему методу действий, и как он узнает о цифрах? Обычно я вызываю метод действия с помощью AJAX и получаю результат и показываю результат.

Без AJAX вам необходимо использовать одну форму для восходящего и одно для нисходящего. Или вы можете использовать переключатель, чтобы пользователь мог сначала выбрать заказ.

Вот несколько кодов для этого с помощью переключателей.

Действие:

[HttpPost] 
public ActionResult SortDesc([Bind(Include = "Number1, Number2, Number3, Number4, SortOrder")] NumberList model) { 

    if(!ModelState.IsValid) { 
     return View("Index"); 
    } 
    model.Numbers = new List<int>(); 
    model.Numbers.Add(model.Number1); 
    model.Numbers.Add(model.Number2); 
    model.Numbers.Add(model.Number3); 
    model.Numbers.Add(model.Number4); 
    model.Numbers.Add(model.Number5); 
    if (model.SortOrder == "Desc") { 
     model.Numbers = model.Numbers.OrderByDescending(i => i).ToList(); 
    } 
    else { 
     model.Numbers = model.Numbers.OrderBy(i => i).ToList(); 
    } 

    return View("Index", model); 

} 

Модель:

public class NumberList { 
    public int Number1 { get; set; } 
    public int Number2 { get; set; } 
    public int Number3 { get; set; } 
    public int Number4 { get; set; } 
    public int Number5 { get; set; } 
    public int NumberListId { get; set; } 
    public List<int> Numbers { get; set; } 
    public string SortOrder { get; set; } 
} 

Вид:

@using(Html.BeginForm("SortDesc", "Home", FormMethod.Post)) { 
<div class="row"> 
    <div class="col-md-12"> 
     <div class="panel panel-info"> 
      <div class="panel-heading"><i class="glyphicon glyphicon-arrow-right"></i> Enter Your Four Numbers</div> 
      <div class="panel-body"> 
       <form class="form-inline"> 
        <div class="col-md-9"> 
         <div class="form-group"> 
          <label class="sr-only" for="number1">1st Number</label> 
          <input type="number" class="form-control" id="number1" name="Number1" placeholder="#1"> 
         </div> 
         <div class="form-group"> 
          <label class="sr-only" for="number2">2nd Number</label> 
          <input type="number" class="form-control" id="number2" name="Number2" placeholder="#2"> 
         </div> 
         <div class="form-group"> 
          <label class="sr-only" for="number3">3rd Number</label> 
          <input type="number" class="form-control" id="number3" name="Number3" placeholder="#3"> 
         </div> 
         <div class="form-group"> 
          <label class="sr-only" for="number4">4th Number</label> 
          <input type="number" class="form-control" id="number4" name="Number4" placeholder="#4"> 
         </div> 
         <div class="form-group"> 
          <input type="radio" class="form-control" id="number4" name="SortOrder" value="Desc"> 
         </div> 
         <div class="form-group"> 
          <input type="radio" class="form-control" id="number4" name="SortOrder" value="Asc"> 
         </div> 
        </div> 

        <div class="col-md-3 text-right"> 
         <button class="btn btn-default"><i class="glyphicon glyphicon-arrow-down"></i> Sort </button> 
         @*<a class="btn btn-default"><i class="glyphicon glyphicon-arrow-down"></i> Sort Asc</a>*@ 
        </div> 
       </form> 
       <p> 
        @if(Model != null) { 
         foreach(int number in Model.Numbers) { 
         <span class="label label-info">@number</span> 
         } 
        } 
       </p> 

      </div> 
     </div> 
    </div> 
</div> 

} 
+0

Та же проблема - ресурс не найден. Описание: HTTP 404. Ресурс, который вы ищете (или его зависимости), мог быть удален, изменилось его имя или временно недоступно. Просмотрите следующий URL-адрес и убедитесь, что оно написано правильно. Запрошенный URL:/Главная/SortDesc –

+0

Вам необходимо передать числа в свое действие. Вам нужна помощь в этом? – CodingYoshi

+0

Метод действия 'SortDesc' имеет атрибут' [HttpPost] ', поэтому убедитесь, что вы его не вызывали, используя' GET'. Другими словами, просто открытие/Home/SortDesc в вашем браузере невозможно, это ** будет ** быть вызовом 'POST', поступающим с другой страницы (например,/Home/Index). –

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