Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么从GET操作填充的唯一隐藏字段没有在模型中传递?_C#_Asp.net Mvc 3_Model - Fatal编程技术网

C# 为什么从GET操作填充的唯一隐藏字段没有在模型中传递?

C# 为什么从GET操作填充的唯一隐藏字段没有在模型中传递?,c#,asp.net-mvc-3,model,C#,Asp.net Mvc 3,Model,对不起,标题太长了,我不知道怎么把它改短 我的代码: 我的模型: public class CarFilter { public String carMake { get; set; } public String carModel { get; set; } public String carEdition { get; set; } . . . public String SortBy { get; set; } } public c

对不起,标题太长了,我不知道怎么把它改短

我的代码: 我的模型:

public class CarFilter {
    public String carMake { get; set; }
    public String carModel { get; set; }
    public String carEdition { get; set; }
    .
    .
    .
    public String SortBy { get; set; }
}

public class CarSearch : CarFilter {
    public List<Car> Car { get; set; }
}
我的控制器:

public ActionResult SearchResult(CarSearch search)
    {
        var cars = from d in db.Cars
                   select d;

        if (Request.HttpMethod == "POST")
        {
            search.SortBy = "Price";
        }
        search.Car = new List<Car>();
        search.Car.AddRange(cars);

        var temp = new List<CarSearch>();
        temp.Add(search);

        return View(temp);
}
用户筛选结果的“我的索引”视图:

@model IEnumerable<Cars.Models.CarSearch>
@using (Html.BeginForm("SearchResult", "Home", FormMethod.Post)){..forms and other stuff..}
我的SearchResult视图,用户可在其中查看过滤结果:

@model IEnumerable<Cars.Models.CarSearch>
@using (Html.BeginForm("SearchResult", "Home", FormMethod.Get))
{
@Html.Hidden("carMake")
@Html.Hidden("carModel")
@Html.Hidden("carEdition")
.
.
.
@Html.Hidden("SortBy")

<input name="SortBy" class="buttons" type="submit" value="Make"/>
我的目标 我试图做的是,当用户单击sort by Make时,它必须将隐藏字段中的所有变量返回到SearchResult操作,以便对结果进行排序,使其与过滤结果相同

后果 是:。该值为null,并且未传递该值,但所有其他隐藏字段(如carMake等)都具有该值。但当我使用foreach时,它工作得非常完美

问题
为什么会这样?SortBy与视图中的其他字段位于同一模型类中。唯一的区别是SortBy并没有在索引视图中用其他字段填充,而是在控制器操作中填充。对此有何解释?我是否缺少任何C定义或动态对象之类的内容?

您没有将任何html元素绑定到模型中的任何内容,只是告诉它创建具有特定名称的隐藏字段

请尝试@Html.HiddenFormodel=>model.CarMake,而不是使用@Html.HiddencarMake

现在,您还需要以某种方式将搜索设置发送到视图。 你在ViewModels上的继承让我有点不舒服。 我认为没有什么理由让CarSearch继承自CarFilter。搜索真的是一个过滤器吗? 让Action SearchResult接收CarFilter并返回CarSearch可能会更清晰,其中CarSearch可以是:

public class CarSearch 
{
    public CarFilter Filter { get; set; }
    public List<Car> Cars { get; set; }
}
对于表示搜索结果的实际车辆,您可以使用@Html.DisplayFor执行foreach、部分视图或显示模板。 我可能会选择最后一个


注意:我更改了您的属性的大小写,因为您可能希望遵守C命名约定。

感谢您的回复Pablo Romeo。然而,关于问我为什么继承了CarFilter。我试图不从CarFilter继承CarSearch,但问题是,当我将索引视图中的参数发布到SearchResult操作时(无论是CarFilter还是CarSearch),它只会将对象CarSearch本身和CarFilter中的所有值传递为null。但是当我使用继承时,它工作得非常好。MVC实际上不会传递任何特定的消息。它将创建声明为参数的类型,并尝试使用请求中的任何信息填充该类型,查找与viewmodel的属性名称匹配的字段。如果名称匹配,将设置属性。还有一件事。正如你提到的@Html.HiddenFormodel=>model.CarMake,我不得不说@Html.hiddenfarmake实际上是有效的。我提到的问题是关于@Html.HiddenSortBy,temp.SortBy。这就是为什么我想知道为什么它会这样?因为它们都有相同的条件,但唯一不同的是SortBy不是由Index视图传递的,而是由SearchResult操作本身填充的。现在,我知道如何解决这个问题,但我不明白背后的原因、理论和逻辑。也许我没有完全理解你的观点。您可能希望在视图中只使用viewmodel中的内容。这使得逻辑更简单,也更容易理解。哦,我很抱歉,我眼中的临时工在我的foreach中,我完全忘了删除它。我真的为此道歉。
public ActionResult SearchResult(CarFilter filter)
{
    ...
    return View(new CarSearch {Filter = filter, Cars = <your result>});
}
@Html.HiddenFor(model => model.Filter.CarMake)