2017-05-04 1 views
3

Ich habe eine Listenseite (Index), die eine Liste von Elementen in einem Raster anzeigt. Die Seite besteht aus einem kleinen Formular am oberen Rand und einem Raster (Liste) am unteren Rand. Das Formular dient zum Filtern der in der Liste angezeigten Elemente.So prüfen Sie, ob die Seite als Ergebnis der Formularübermittlung oder auf andere Weise angezeigt wird

Ich muss überprüfen, ob die Seite als Ergebnis des Absendens des Formulars angezeigt wird (Klicken auf eine der 2 Schaltflächen) oder durch Klicken auf einen Link von einer anderen Seite oder durch Eingabe der URL direkt in der Adressleiste des Browsers.

The View:

@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 --> 

Der Aktions Controller:

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

Normalerweise gibt es eine zusätzliche Controller-Aktion mit einer Methodensignatur von 'public ActionResult Index()' und das ist die Methode, die getroffen wird, wenn Sie von einem angeklickten Link oder URL-Eintrag in der Adressleiste weitergeleitet werden. –

+1

Sie müssen nur in Ihrem ViewModel eine Boolesche Eigenschaft hinzufügen, die auf false gesetzt ist. Sie müssen ein verstecktes Feld in Ihrem Formular für diese Eigenschaft auf true setzen. Im Controller überprüfen Sie diese Eigenschaft. Wenn du das nicht schaffst, werde ich dir später ein Beispiel schicken –

+0

Danke @LucianBumb. Ich denke auch daran, versteckte Eigenschaften zu verwenden, wenn ich keine bessere oder elegantere Lösung finden kann. – corix010

Antwort

2

Da Sie Ihre Form sind das Senden als GET, als auch, alle diese Methoden (Absenden des Formulars einen Link , geben Sie die URL in die Adressleiste ein) sind aus Sicht des Servers funktional äquivalent. Sie sind alle nur GET-Anfragen für die gleiche URL.

Wenn Sie nur das Senden des Formulars unterscheiden müssen, können Sie entweder ein verstecktes Feld hinzufügen oder einfach den Absenden-Button benennen. In jedem Fall können Sie dann das Objekt Request für diesen Namen untersuchen, und wenn es existiert, können Sie davon ausgehen, dass das Formular gesendet wurde.

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

Dann:

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

Dies ist jedoch leicht gefälscht werden kann. Zum Beispiel könnte jemand einfach die URL eingeben, http://foo.com/?FormSubmitted, und es gibt keine Möglichkeit für Sie zu wissen. Ich bin mir nicht sicher, wie sehr sich böswillige Benutzer in diesem Szenario Sorgen machen, aber Sie könnten dies etwas mildern, indem Sie etwas, das Sie suchen, obskurer machen, also ist es nicht so offensichtlich wie "FormSubmitted". Oder Sie können JavaScript verwenden, um etwas in das Formular einzufügen, und dieses dann möglicherweise in einer verkleinerten externen Datei zu vergraben. Dennoch ist Sicherheit durch Dunkelheit immer noch keine Sicherheit.

Kurz gesagt, es gibt keine Möglichkeit zu sagen. Auch diese Methoden sehen auf einem Server genau gleich aus. Um die Methode zu unterscheiden, muss die tatsächliche Anforderung in irgendeiner Weise unterschiedlich sein, z. B. Ändern der Abfragezeichenfolge, Senden als POST anstelle von GET, usw. Andernfalls, wenn es genau dieselbe Anfrage ist, weiß der Server nicht oder Vorsicht, wie es dazu kam.

+0

Danke @ Chris Pratt. Ich habe zwei Schaltflächen "Filter anwenden" und "Filter löschen", die beim Klicken als Formularübergaben betrachtet werden sollten. Wird Ihre Lösung in diesem Fall noch funktionieren? Sollten beide "FormSubmitted" heißen? – corix010

+1

Ja, zu diesem Zweck spielt es keine Rolle. Auf welche Schaltfläche auch immer geklickt wird, der Name dieser Schaltfläche wird zur Anfrage hinzugefügt. Es kann jedoch besser sein, sie nur 'ApplyFilter' und' ClearFilter' zu nennen, da dies etwas verschleiert, wofür Sie die Namen verwenden. Dann können Sie einfach überprüfen, ob einer dieser Namen in die Anfrage aufgenommen wurde. –

+0

Dank @Chris Pratt. Ich werde es versuchen. – corix010

Verwandte Themen