2012-12-07 77 views
1

对不起,我不知道如何缩短它的长度。为什么从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#定义或诸如动态对象之类的东西?

回答

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#的命名约定。

+0

谢谢你的回复巴勃罗罗密欧。然而,关于问我为什么我从'CarFilter'继承。我试图不从CarFilter继承CarSearch,但问题是当我从Index视图发布参数到我的SearchResult操作(无论是CarFilter还是CarSearch)时,它只会将CarSearch本身和CarFilter中的所有值作为null传递。但是当我使用继承时,它完美地工作。 – moamzia

+0

MVC实际上不会传递任何特定的内容。它会做的是创建你声明的类型作为参数,并尝试使用请求中的任何信息来填充它,寻找匹配viewmodel属性名称的字段。如果名称匹配,则会设置属性。 –

+0

还有一件事。正如你提到过的@ Html.HiddenFor(model => model.CarMake)',我不得不说'@ Html.Hidden(“carMake”)实际上是有效的。我提到的问题只是关于'@ Html.Hidden(“SortBy”,temp.SortBy)'。这就是为什么它让我想知道为什么它是这样的?因为它们都具有相同的条件,但唯一不同的是'SortBy'没有被Index视图传递,而是被SearchResult操作本身填充。现在我又知道如何解决这个问题,但我不明白这背后的原因,理论和逻辑。 – moamzia

相关问题