繁体   English   中英

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

[英]Why the only hidden field that is being filled from GET action is not being passed in 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 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"/>
  • 我的目标

我要尝试做的是,当用户单击“排序”时,必须将隐藏字段中的所有变量取回SearchResult操作,以便对结果进行排序(相同的过滤结果)。

  • 结果

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

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

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

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

现在,您将需要以某种方式将搜索设置发送到视图。 您对ViewModels的继承使我有点失望。 我认为让CarSearch继承自CarFilter的理由CarFilter 一个搜索真的是一个过滤器? 让Action SearchResult接收CarFilter并返回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)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM