2017-05-04 15 views
3

我有一個列表頁面(索引)顯示網格中的項目列表。該頁面由頂部的小表單和底部的網格(列表)組成。該表格可用作過濾列表中顯示的項目的方式。如何檢查作爲表單提交結果或其他方式顯示頁面

我需要檢查提交表單(單擊2個按鈕中的任何一個)或通過單擊來自其他頁面的鏈接或直接在瀏覽器的地址欄中輸入URL來顯示頁面。

的觀點:

@model MyNameSpace.ViewModels.FooFilterViewModel 

@{ 
    ViewBag.Title = "Foo Listing"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>@ViewBag.Title</h2> 

@using (Html.BeginForm("Index", "Home", FormMethod.Get)) 
{ 
    @Html.ValidationSummary(true) 

    <!-- Field controls used for filtering go here --> 

    <input id="ClearFilter" type="button" value="Clear Filter" /> 
    <input id="ApplyFilter" type="submit" value="Apply Filter" /> 
} 

<!-- Grid displaying the list of foos goes here --> 

控制器動作:

public ActionResult Index(FooFilterViewModel fooFilterViewModel) 
{ 
    // Retrieve all records 
    IQueryable<Foo> foos = _DBContext.Foos; 

    if (ModelState.IsValid) 
    { 
     if (/* check if coming from form submission */){ 
      // Do something 
     } 
     else 
     { 
      // Do something else 
     } 

     // Code to filter records go here 
     foos = foss.Where(f => f...........) 
    } 

    fooFilterViewModel.Foos = foos; 

    return View(fooFilterViewModel); 
} 
+0

通常情況下,會有一個額外的控制器操作,其中包含'public ActionResult Index()'的方法簽名,這是當您從地址欄中的點擊鏈接或URL條目路由時會被點擊的方法。 –

+1

您只需要在您的ViewModel中添加一個布爾屬性設置爲false,您需要在表單中爲此屬性設置爲true來添加隱藏字段。在控制器中你檢查這個屬性。如果你不管理這個,後來我會發布你的例子 –

+0

謝謝@LucianBumb。如果找不到更好或更優雅的解決方案,我也在考慮使用隱藏的屬性。 – corix010

回答

2

既然你要發送的GET,還有,所有的這些方法(表單提交表單,下面的鏈接,在地址欄中輸入URL)在功能上等同於服務器的角度。它們都只是對同一個URL的GET請求。

如果你只是需要區分表單提交,你可以添加一個隱藏的字段,或者簡單地命名你的提交按鈕。無論哪種方式,您都可以檢查Request對象的名稱,如果存在,您可以假定表單已提交。

<button type="submit" name="FormSubmitted">Submit</button> 

然後:

if (Request["FormSubmitted"] != null) 
{ 
    // form was submitted 
} 

然而,這可以很容易僞造。例如,有人可以簡單地輸入網址http://foo.com/?FormSubmitted,這樣你就無法知道。我不確定在這種情況下惡意用戶可能會有多少關注,但是您可以通過使您尋找更隱晦的內容來減輕這種情況,所以它不像「FormSubmitted」那樣明顯。或者,您可以使用JavaScript來設置表單中的某些內容,然後將其隱藏在縮小的外部文件中。儘管如此,通過默默無聞的安全仍然不安全。

儘管如此,沒有辦法告訴。再一次,所有這些方法與服務器完全一樣。爲了區分該方法,實際的請求需要在某些方面有所不同,例如更改查詢字符串,發送POST而不是GET等。否則,如果它完全相同的請求,則服務器不知道或關心它是如何產生的。

+0

謝謝@Chris Pratt。我有兩個按鈕「應用過濾器」和「清除過濾器」,單擊時應被視爲表單提交。您的解決方案在這種情況下仍然可以工作是否都應該被命名爲「FormSubmitted」? – corix010

+1

是的,爲了這個目的,沒關係。無論點擊哪個按鈕,該按鈕的名稱都會被添加到請求中。然而,將它們命名爲「ApplyFilter」和「ClearFilter」可能會更好,因爲這會讓您的名字變得模糊不清。然後,您可以簡單地檢查這些名稱中的任何一個是否已將其添加到請求中。 –

+0

謝謝@Chris Pratt。我會試一試。 – corix010

相關問題