簡體   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