2014-05-02 76 views
2

我有一個顯示人員列表的頁面。它可以按名和姓排序。要搜索的人,我有以下的剃刀形式:Html.BeginForm失去提交路線的價值

@using (Html.BeginForm("Index", "Persons", new { sort = ViewBag.Sort }, FormMethod.Get)) 
{ 
    <p> 
     Search: @Html.TextBox("search", ViewBag.Search as string) 
     <input type="submit" value="Search" /> 
    </p> 
} 

ViewBag.SearchViewBag.Sort包含上次使用searchsort routeValues。當我在第一個名字排序的人員列表,形式獲取呈現在HTML這樣的:

<form action="/persons?sort=firstname" method="get"> 
    <p> 
     Search: <input id="search" name="search" type="text" value="" /> 
     <input type="submit" value="Search" /> 
    </p> 
</form> 

如預期,?sort=firstname包括在行動。但是,當我按提交按鈕(搜索)時,sort參數將丟失。新的網址只有?search=...。我怎樣才能解決這個問題?

回答

8

當你看到在輸出HTML,你會得到這樣的:

<form action="/persons/index?sort=asc" method="get"> 
    <p> 
     <input type="text" name="search" /> 
     <input type="submit" value="Search" /> 
    </p> 
</form> 

這似乎是完全合法的,你會期望喜歡的追加投入後的查詢行爲。但是這受到HTTP規範的限制。表單發佈操作的查詢字符串不會被追加。這就是爲什麼你的查詢參數不會在你的服務器端工作。然而,我期望從Asp.net獲取表單的參數自動隱藏字段,它現在不會。

正如你必須把輸入的形式,所以你可以使用隱藏域做到這一點像一個妥善的解決辦法:

@using (Html.BeginForm("Index", "Persons", FormMethod.Get)) 
{ 
    @Html.Hidden("sort",ViewBag.Sort) 
    <p> 
     Search: @Html.TextBox("search", ViewBag.Search as string) 
     <input type="submit" value="Search" /> 
    </p> 
} 
+0

這似乎是在剃刀這樣做的最好的方式。謝謝。 –

5

您需要在表單某處存儲sort的值,以便將其作爲提交的一部分包含在內。你可以嘗試一個隱藏的輸入:

@using (Html.BeginForm("Index", "Persons")) 
{ 
    <input type="hidden" id="sort" value="firstname" /> 
    <p> 
     Search: @Html.TextBox("search", ViewBag.Search as string) 
     <input type="submit" value="Search" /> 
    </p> 
} 

您可能需要調整如何排序的值從檢索到的,我把firstname作爲一個例子,但是當你提交表單,sort將例如包括在有效載荷

[HttpPost] 
public ActionResult Index(string sort, string search) 
{ 
}