对不起,我不知道如何缩短它的长度。为什么从GET动作中填充的唯一隐藏字段没有在模型中传递?
- 我的代码:
我的模型:
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..}
我的信息搜索结果视图(其中用户看到过滤的搜索结果):
@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=""/>
。该值为空,并且未被传递,但其他所有隐藏字段(如carMake
等)都具有值。但是当我使用foreach
它完美的作品。
- 问题
这是为什么这样呢? SortBy与视图中的其他字段处于相同的模型类中。唯一的区别是SortBy没有被其他字段填充到索引视图中,而是被控制器操作填充。这是什么解释?我是否缺少任何C#定义或诸如动态对象之类的东西?
谢谢你的回复巴勃罗罗密欧。然而,关于问我为什么我从'CarFilter'继承。我试图不从CarFilter继承CarSearch,但问题是当我从Index视图发布参数到我的SearchResult操作(无论是CarFilter还是CarSearch)时,它只会将CarSearch本身和CarFilter中的所有值作为null传递。但是当我使用继承时,它完美地工作。 – moamzia
MVC实际上不会传递任何特定的内容。它会做的是创建你声明的类型作为参数,并尝试使用请求中的任何信息来填充它,寻找匹配viewmodel属性名称的字段。如果名称匹配,则会设置属性。 –
还有一件事。正如你提到过的@ Html.HiddenFor(model => model.CarMake)',我不得不说'@ Html.Hidden(“carMake”)实际上是有效的。我提到的问题只是关于'@ Html.Hidden(“SortBy”,temp.SortBy)'。这就是为什么它让我想知道为什么它是这样的?因为它们都具有相同的条件,但唯一不同的是'SortBy'没有被Index视图传递,而是被SearchResult操作本身填充。现在我又知道如何解决这个问题,但我不明白这背后的原因,理论和逻辑。 – moamzia