2016-12-02 96 views
2

当试图将模型绑定到视图时,出现404错误。 ActionResult被称为“SortDesc”,但视图只是一个标准的“索引”视图。我明白,这是不加载,因为现在有称为'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; } 
} 

剃刀:

@{ 
    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文件\t线\t抑制状态 错误\t CS0029 \t无法隐式转换类型“System.Collections.Generic.List 'to'System.Collections.Generic.List '\t CSIMediaASPTest –

+0

我的不好。是从头开始的。错过了'List ' – 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

生成一个错误:表达式树可能不包含动态操作 - 即'm.Numbers [i]'即 –

+0

即时非常接近 - 不在模型中传递 - 我在ActionResult中设置了模型的值Index( )但它们没有通过SortDesc –

+0

这是因为链接正在执行一个GET,而不是一个POST,他们不能。将表单更新为指向@using(Html.BeginForm())的动作,并将该排序作为模型的属性而不是两个单独的动作。 – Nkosi

1

您可以修复使用的各种技术问题。

传递视图的名称为View方法是这样的:

return View("Index", list); 

View方法有很多重载,你可以看到他们所有here。很高兴让自己熟悉像你所面临的情况下的过载情况。

如果您的视图与动作不在同一文件夹中,则需要传递视图的路径而不是名称。

另一种方法是有一个单一的动作,你也可以调用这一个索引,但是这个将以模型作为参数。您的模型可以包含数字和排序的枚举:Desc,Asc。在你的行动方法中,你可以分析模型,并做任何需要的。

该模型的方法是我喜欢的。

编辑

我只注意到你有你的观点这行代码:

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

这将触发一个HTTP GET,因此它不会打你SortDsc操作方法。从您的操作方法中删除POST或使用post技巧(表单)使用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.您正在查找的资源(或其某个依赖项)可能已被删除,名称已更改或暂时不可用。请检查以下网址并确保它拼写正确。 请求的网址:/首页/ SortDesc –

+0

您需要将数字传递给您的操作。你还需要帮助吗? – CodingYoshi

+0

行为方法'SortDesc'具有属性'[HttpPost]',所以请确保你没有使用'GET'调用它。换句话说,只需在浏览器中打开/ Home/SortDesc是不可能的,它将**作为来自其他页面(例如/ Home/Index)的“POST”调用。 –