【问题标题】:Issues with Binding Model to view要查看的绑定模型问题
【发布时间】:2017-04-17 12:09:04
【问题描述】:

尝试将模型绑定到视图时,出现 404 错误。 ActionResult 称为“SortDesc”,但视图只是标准的“索引”视图。我知道这没有加载,因为现在有一个名为“SortDesc”的视图。但是,我有两个按钮,一个用于对数据进行升序排序,一个用于对数据进行降序排序,因此有两个单独的功能。我只是不确定这里最好的解决方案是什么,要么继续使用两个单独的函数并以某种方式传入正确的视图以加载,要么在 Index 上创建一个新的单个 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);
    }

}

【问题讨论】:

  • 在动作中,变量numbers 没有赋值给任何东西。如何让视图意识到它?你需要设置list.numbers = numbers;
  • 引发错误:严重性代码描述项目文件行抑制状态错误 CS0029 无法将类型 'System.Collections.Generic.List' 隐式转换为 'System.Collections.Generic.List' CSIMediaASPTest
  • 我的错。是的,从头开始。错过了List&lt;int&gt;
  • 你在那个动作中实际上想做什么?
  • 所以我将 NumberSetModel 中的列表更改为 List - 现在我真的不需要额外的类 - 所以现在 numbers 为空,因为它没有获取输入的值 -我想获取输入,对它们进行排序,将它们添加到模型中,然后以正确的顺序显示模型

标签: c# asp.net-mvc razor


【解决方案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);
    }
}

【讨论】:

  • 生成错误:表达式树可能不包含动态操作 - 即 'm.Numbers[i]'
  • 现在非常接近 - 不传入模型 - 我在 ActionResult Index() 中为模型设置了值,但它们没有传递到 SortDesc
  • 那是因为链接执行的是 GET 而不是 POST,它们不能。更新表单以指向操作 @using (Html.BeginForm()),并将排序作为模型的属性包含在内,而不是两个单独的操作。
  • 传递排序顺序的最佳方法是什么?有没有办法提取链接上的文字之类的?
  • @WebDevelopWolf 检查上次更新。注意动作名称也更改了。
【解决方案2】:

您可以使用多种技术解决此问题。

将视图的名称传递给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 来访问您的操作方法。

编辑 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>

}

【讨论】:

  • 同样的问题 - 找不到资源。说明:HTTP 404。您正在查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请查看以下 URL 并确保其拼写正确。请求的 URL:/Home/SortDesc
  • 您需要将数字传递给您的操作。你也需要这方面的帮助吗?
  • 动作方法SortDesc 具有属性[HttpPost],所以请确保您没有使用GET 调用它。换句话说,仅在浏览器中打开 /Home/SortDesc 是不可能的,它必须是来自其他页面(例如 /Home/Index)的 POST 调用。
  • 我还以为是 [Bind(Include = "Number1, Number2, Number3, Number4")] 做了什么?
  • 这触发了一个很棒的动作,但仍然没有从四个输入中传递数字?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多