很抱歉这个长标题,我不知道如何缩短标题。
我的模特:
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操作,以便对结果进行排序(相同的过滤结果)。
是:<input id="SortBy" name="SortBy" type="hidden" value=""/>
。该值为null并且未被传递,但所有其他隐藏字段(如carMake
等)都具有值。但是,当我使用foreach
时,它的工作非常完美。
为什么会这样? SortBy与视图中的其他字段位于同一模型类中。唯一的区别是SortBy没有在其他字段的索引视图中填充,而是在控制器操作中填充。对此有何解释?我是否缺少任何C#定义或诸如动态对象之类的内容?
答案 0 :(得分:0)
您没有将任何html元素绑定到模型中的任何内容,只是告诉它创建具有特定名称的隐藏字段。
而不是@Html.Hidden("carMake")
尝试使用@Html.HiddenFor(model => model.CarMake)
。
现在,您还需要以某种方式将搜索设置发送到视图。
你在ViewModels上的继承让我有点失望。
我认为让CarSearch
继承CarFilter
的原因并不重要。 搜索真的是一个过滤器吗?
让行动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)
对于代表搜索结果的实际汽车,您可以使用foreach
执行@Html.DisplayFor()
,部分视图或展示广告模板。
我可能会选择最后一个。
注意:我更改了属性上的大小写,因为您可能希望坚持使用C#命名约定。