[asp.net MVC 1] submitImage en resulterende url

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BulMi
  • Registratie: April 2006
  • Laatst online: 15-09 04:34
Ik heb het volgende stukje code
code:
1
2
3
4
5
6
  <%  using ( Html.BeginForm("Index","Zoek")) 
               { %>
               <%= Html.TextBox("zoekwaarden") %>
               <%= Html.SubmitImage("Zoek", "../../Images/btnZoeken.gif") %>
            <% } 
            %>


Het werkt goed, ik kom netjes uit in in mijn index(string zoekwaarden) methode van mijn zoekController. Echter zie ik in de URL niet mijn parameter terug. Alleen url/Search/

Dit staat er in mijn global.asax
code:
1
2
3
4
5
6
7
8
9
10
 routes.MapRoute(
                "Zoek",                                              // Route name
                "Search/{zoekwaarden}",                           // URL with parameters
                new
                {
                    controller = "Zoek",
                    action = "Index",
                    zoekwaarden = "",
                }  // Parameter defaults
            );

Om te kijken of mijn routing goed staat heb ik url/Search/test als url opgegeven en deze komt ook netjes in de zelfde methode van mijn zoekcontroller, waarbij de parameter zoekwaarden de waarde test heeft.

Nu is mijn vraag, hoe krijg ik de waarde die ik invul en de textbox zoekwaarden in mijn url?

Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Html.BeginForm() geeft een form terug met een method="post"

Door dit te doen krijg je een GET en zal je de "zoekwaarden" veld in je URL krijgen:
C#:
1
Html.BeginForm("Index", "Zoek", null, FormMethod.Get) 


Dit is niet iets specifieks voor ASP.NET MVC, maar een gewoon HTML iets.

[ Voor 14% gewijzigd door TheNameless op 23-11-2009 17:33 ]

Ducati: making mechanics out of riders since 1946


Acties:
  • 0 Henk 'm!

  • BulMi
  • Registratie: April 2006
  • Laatst online: 15-09 04:34
Ik heb het aangepast naar using (Html.BeginForm<RcpMvc.Controllers.ZoekController>(c=>c.Index(null),FormMethod.Get))
(heb ook de variant met "Index", "Zoek" geprobeerd, maar resultaat is bij beide het zelfde)

Met de FormMethod.Get krijg ik inderdaad mijn url gevuld. Alleen ook de x en y coordinaten waar er op de zoekknop geklikt is.
url/Search/?zoekwaarden=een+twee+drie&zoekimg.x=65&zoekimg.y=66

Ik hoopte hier op url/Search/een+twee+drie

Dat het nu met ? parameters is komt denk ik doordat mijn route niet match met zoekimg.x en zoekimg.y. Hierin ben ik echter ook helemaal niet geintereseerd. Hoe krijg ik deze uit de url?

Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Michel82 schreef op maandag 23 november 2009 @ 18:38:
Ik heb het aangepast naar using (Html.BeginForm<RcpMvc.Controllers.ZoekController>(c=>c.Index(null),FormMethod.Get))
(heb ook de variant met "Index", "Zoek" geprobeerd, maar resultaat is bij beide het zelfde)

Met de FormMethod.Get krijg ik inderdaad mijn url gevuld. Alleen ook de x en y coordinaten waar er op de zoekknop geklikt is.
url/Search/?zoekwaarden=een+twee+drie&zoekimg.x=65&zoekimg.y=66

Ik hoopte hier op url/Search/een+twee+drie

Dat het nu met ? parameters is komt denk ik doordat mijn route niet match met zoekimg.x en zoekimg.y. Hierin ben ik echter ook helemaal niet geintereseerd. Hoe krijg ik deze uit de url?
Hij zou in ieder geval evengoed je ingestelde route goed moeten pakken, ook als je teveel parameters hebt.

Word je eigen route eerder toegevoegd aan je RouteTable dan de default Route?
Ik heb namelijk ervaren dat als je default route boven je andere routes staan, hij soms de default route pakt omdat die eerder gematched word.

Over die X en Y; wat voor HTML genereerd die Html.SubmitImage() precies? Misschien iets van een imagemap of iets dergelijks?

[ Voor 9% gewijzigd door TheNameless op 23-11-2009 19:12 ]

Ducati: making mechanics out of riders since 1946


Acties:
  • 0 Henk 'm!

  • BulMi
  • Registratie: April 2006
  • Laatst online: 15-09 04:34
Ik heb het idee dat ik iets doms over het hoofd zie...
Heb nu van de submitImage een SubmitButton gemaakt.

Volgende code view:
code:
1
2
3
4
5
6
7
   <%  using (Html.BeginForm<RcpMvc.Controllers.ZoekController>(c=>c.Index(null),FormMethod.Get)) 
               { %>
               <%= Html.TextBox("zoekwaarden") %>
                <%= Html.SubmitButton() %>
             
            <% } 
            %>

Volgende code global.asax(meteen na de ignore al de route voor zoeken opgenomen) :
code:
1
2
3
4
5
6
7
8
9
10
11
 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Zoek",                                              // Route name
                "Search/{zoekwaarden}",                           // URL with parameters
                new
                {
                    controller = "Zoek",
                    action = "Index",
                    zoekwaarden = ""
                }  // Parameter defaults
            );


Volgende code controller:
code:
1
2
3
4
5
6
7
8
9
        public ActionResult Index(string zoekwaarden)
        {
            zoekwaarden = zoekwaarden.Replace("x", "y");
           //Dummy code voor snelle test            
            ZoekFormViewModel zfvm = new ZoekFormViewModel();
            zfvm.Zoekwaarden = zoekwaarden;

            return View(zfvm);
        }


Ik zet een breakpoint in mijn controller en na het drukken van de button kom ik ook in mijn controller. zoekwaarden is echter elke keer "" (de default waarde uit global.asax, als ik daar (string)null neer zet komt er null binnen in mijn controller). Mijn Url is url/Search?zoekwaarden=een+twee+drie

Maak ik er een FormMethod.Post van en van mijn controller method ook een post method, krijg ik wel een waarde in mijn zoekwaarden parameter, echter is de url : url/Search

Dit is de huidige HTML:
code:
1
2
3
4
 <form action="/Search" method="get">
<input id="zoekwaarden" name="zoekwaarden" type="text" value="" />
<input type="submit" />
</form>


Ik wil juist url/Search/een+twee+drie :)

[ Voor 4% gewijzigd door BulMi op 23-11-2009 21:57 ]


Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Ik heb zelf even een test projectje gemaakt en ik snap nu waar je fout gaat in je denken :)

Ik zal proberen uit te leggen wat er gebeurd.

Als je een form via een get submit, wordt automatisch (door de browser) alle variabelen in je form als querystring mee gegeven aan je URL die je als action hebt op gegeven (in dit geval /Search).

De uiteindelijke URL word dan dus: /Search?zoekwaarden=foo.

Dit request komt binnen, er word vervolgens gekeken of deze matched met een door jou opgegeven route.
Deze word wel gematched aan je search-route, maar het formaat waaraan je variabele "zoekwaarden" moet voldoen, klopt niet (omdat de URL "/Search?zoekwaarden=foo" is en niet "/Search/foo") en krijg je dus je default waarden uit je Route.

De route werkt echter wel prima, probeer het volgende maar eens:
C#:
1
<%=Html.ActionLink<RcpMvc.Controllers.ZoekController>(c => c.Index("foo"), "Test link") %>


Wat je kan doen om het wel precies werkend te krijgen is om via javascript de onsubmit op te vangen, je URL op te bouwen zoals je wilt (/Search/foo) en vervolgens een redirect doen.

Of je kan Submitten naar een andere action en daar een redirect doen:
C#:
1
2
3
4
<%using (Html.BeginForm<RcpMvc.Controllers.ZoekController>(c => c.Zoek(null))){ %>
    <%=Html.TextBox("zoekwaarden") %>
    <%=Html.SubmitButton() %>
<%} %>

C#:
1
2
3
4
5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Zoek(string zoekwaarden)
{
    return RedirectToRoute("Zoek", new { zoekwaarden = zoekwaarden });
}

[ Voor 12% gewijzigd door TheNameless op 23-11-2009 23:07 ]

Ducati: making mechanics out of riders since 1946


Acties:
  • 0 Henk 'm!

  • BulMi
  • Registratie: April 2006
  • Laatst online: 15-09 04:34
Bedankt, dit werkt perfect!
Asp.net mvc bevalt me tot nu toe erg goed, vind het alleen jammer dat ik voor bovengenoemde toch wat extra's moet doen(ook al is het maar 1 regel code)

Ik weet niet of ik er in dit topic verder op moet in gaan of nieuwe voor moet aanmaken...

Maar ik het nog wel een vraag over spaties, nu wordt het "een%20twee%20drie". Met replace, regex is het geen probleem om de spaties om te zetten naar - of _. In bovengenoemde deel zou het zelf in controller kunnen oplossen Maar het lijkt me ook nog wel mogelijk hier een javasript ofzo voor te maken die ik in de views zet.
Mijn vraag is of ik nu moeilijk/omslachtig aan het doen ben en ergens op 1 plek iets kan opgeven zodat spaties omgezet worden naar bijv. "-" Aangezien een van de grote voordelen bij mvc die friendly url;s zijn verwacht ik eigenlijk iets handigs dat er al ingebouwd is voor je(voor zo'n standaard probleem)

[ Voor 9% gewijzigd door BulMi op 24-11-2009 01:11 ]


Acties:
  • 0 Henk 'm!

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Michel82 schreef op dinsdag 24 november 2009 @ 01:09:
Bedankt, dit werkt perfect!
Asp.net mvc bevalt me tot nu toe erg goed, vind het alleen jammer dat ik voor bovengenoemde toch wat extra's moet doen(ook al is het maar 1 regel code)

Ik weet niet of ik er in dit topic verder op moet in gaan of nieuwe voor moet aanmaken...

Maar ik het nog wel een vraag over spaties, nu wordt het "een%20twee%20drie". Met replace, regex is het geen probleem om de spaties om te zetten naar - of _. In bovengenoemde deel zou het zelf in controller kunnen oplossen Maar het lijkt me ook nog wel mogelijk hier een javasript ofzo voor te maken die ik in de views zet.
Mijn vraag is of ik nu moeilijk/omslachtig aan het doen ben en ergens op 1 plek iets kan opgeven zodat spaties omgezet worden naar bijv. "-" Aangezien een van de grote voordelen bij mvc die friendly url;s zijn verwacht ik eigenlijk iets handigs dat er al ingebouwd is voor je(voor zo'n standaard probleem)
Wat je zou kunnen doen (als je mijn 2e optie hebt gebruikt) is een eigen Route definieren en daarin alle spaties veranderen door + karakters.
Geen idee of je het dan wel nog gewoon spaties krijgt in je controller action.

Zoiets (niet getest):
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Public Class SearchRoute
        Inherits Route

        Public Sub New(ByVal url As String)
            MyBase.New(Url, New MvcRouteHandler())
        End Sub

        Public Overrides Function GetVirtualPath(ByVal requestContext As System.Web.Routing.RequestContext, ByVal values As System.Web.Routing.RouteValueDictionary) As System.Web.Routing.VirtualPathData
            Dim path As VirtualPathData = MyBase.GetVirtualPath(requestContext, values)

            If path IsNot Nothing Then
                path.VirtualPath = path.VirtualPath.Replace(" ", "+")
            End If
            Return path
        End Function
    End Class


En dan je route registreren via:
Visual Basic .NET:
1
2
3
RouteTable.Routes.Add(New SearchRoute("Search/{zoekwaarden}") With { _
     .Defaults = New RouteValueDictionary(New With {.controller = "Zoek", .action = "Index", .zoekwaarden = ""}) _
})


Het zit in ieder geval niet standaard in ASP.NET MVC :)

Ducati: making mechanics out of riders since 1946

Pagina: 1