1

对不起,标题太长了,我不知道如何使它更短。

  • 我的代码:

我的模型:

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"/>
  • 我的目标

我想要做的是当用户点击排序时 Make 它必须将隐藏字段中的所有变量返回到 SearchResult 操作才能对结果进行排序(相同的过滤结果)。

  • 结果

是:<input id="SortBy" name="SortBy" type="hidden" value=""/>。该值为 null 并且没有被传递,但所有其他隐藏字段(例如carMake等)都有值。但是当我使用它时,foreach它完美无缺。

  • 问题

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

4

1 回答 1

0

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

而不是使用@Html.Hidden("carMake")try @Html.HiddenFor(model => model.CarMake)

现在,您还需要以某种方式将搜索设置发送到视图。你在 ViewModel 上的继承让我有点失望。我认为没有太多理由CarSearch继承 from CarFilter。搜索真的是过滤器吗让 ActionSearchResult接收 aCarFilter并返回 a可能更清楚CarSearch,其中CarSearch可能是:

public class CarSearch 
{
    public CarFilter Filter { get; set; }
    public List<Car> Cars { get; set; }
}

动作看起来像:

public ActionResult SearchResult(CarFilter filter)
{
    ...
    return View(new CarSearch {Filter = filter, Cars = <your result>});
}

这样一来,您的操作就更清楚什么是输入和什么是输出。使用该模型,您的隐藏字段将类似于:

@Html.HiddenFor(model => model.Filter.CarMake)

对于代表搜索结果的实际汽车,您可以foreach使用 .,部分视图或显示模板@Html.DisplayFor()。我可能会选择最后一个。

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

于 2012-12-07T04:47:12.397 回答