2011-09-06 19 views
27

mój adres URL wygląda następująco:Korzystanie Html.BeginForm z kwerendy

customer/login?ReturnUrl=home 

W widoku logowania, użyłem tego wzorca kodu, który działa dobrze.

@using(Html.BeginForm()) 
{ 
    ... 
} 

ten wytwarza magiczną po HTML

<form action="customer/login?ReturnUrl=home" method="post"> 

Teraz jednak, że konieczne jest dodanie atrybutów (np data-id="something") w formie. Jak mogę to zrobić? Jeśli nie ma żadnych znaków zapytania, wiem, że mogę zrobić coś takiego:

@using(Html.BeginForm(action, controller, FormMethod.Post, 
         new { data_id="something" })) 

ale nie wiem jak dodać ciągu kwerendy, która powinna być w HTML:

<form action="customer/login?ReturnUrl=home" method="post" data-id="something"> 

myślałem o bezpośrednim używaniu <form>, ale nie wiesz, jak określić zapytanie o zmienną. I nie mam pojęcia, jak to osiągnąć z Html.BeginForm. Każda wskazówka byłaby doceniona.

UCHWAŁA:

Teraz użyłem <form> z następujących podpowiedź How to get current url value in View. Powstały widok wygląda

<form action="@Request.Url.PathAndQuery" data-id="something" method="POST"> 

Ale byłoby miło mieć przeciążony metody BeginForm do tego.

+0

gdzie chcesz dodać atrybut, do formularza lub czegoś w formularzu? – msarchet

+0

Czy chcesz dodać kolejną wartość formularza lub dynamicznie ustawić ciąg zapytania? – Tejs

+0

@msarchet i Tejs Chcę atrybut na elemencie formularza. –

Odpowiedz

15

Myślę, że to nie odpowiada bezpośrednio na pytanie, ale dlaczego nie użyć zwykłego starego tagu formularza?

<form action='customer/[email protected]["ReturnUrl"]' method="post" data-id="something"> 

Alternatywnie można utworzyć niestandardowe rozszerzenie HtmlHelperExtension, które renderuje formularz ze ścieżką i quizem. W tym rozszerzeniu HtmlHelperExtension można iterować za pośrednictwem wartości zapytania i zapełnić parametr routeValueDictionary, który następnie przekazuje się do konstruktora Html.BeginForm.

Jeśli nie chcesz coś tak Extensible można po prostu użyć konstruktora przeciążone Html.BeginForm użyciu @Html.BeginForm("login", "customer", new {ReturnUrl = @Request.QueryString["ReturnUrl"]},FormMethod.Post, new {data-id="something"});

+0

Po prostu zauważyłem, że zredagowałeś swoje pytanie także z pierwszym pomysłem. – arviman

+0

Ale jeśli dodaję kolejny znak zapytania, muszę zmienić kod ponownie. Mam lepszą odpowiedź, zapoznaj się z ostatnią częścią zaktualizowanej odpowiedzi. Dzięki za odpowiedź. –

+0

Nie ma za co. Zaktualizowałem również swoją odpowiedź za pomocą konstruktora samego BeginForm. – arviman

0

Spróbuj @using(Html.BeginForm(null, null, FormMethod.Post, new { data_id="something" }))

Należy użyć domyślnej logiki do skonstruowania URL, tak jakby użyto BeginForm()

(nigdy nie próbowałem, że chociaż w takim przypadku, ale wierzę, że to powinno działać)

+1

Próbowałem już, ale wynikowa forma ma 'action ="/customer/login "'. Powinien to być '/ customer/login? ReturnUrl = home' –

+0

Niestety, nie zachowuje ciągu zapytania przy przekazywaniu wartości null do parametrów akcji i kontrolera. – spikyjt

17

Aby utworzyć RouteValueDictionary z kwerendy:

RouteValueDictionary queryStringDictionary = new RouteValueDictionary(Request.QueryString.AllKeys.ToDictionary(key => key, key => (object)Request.QueryString[key])); 

Następnie można użyć to z Html.BeginForm:

Html.BeginForm(null, null, queryStringDictionary, FormMethod.Post, new Dictionary<string, object> { { "autocomplete", "off" } }) 
14

oto sposób, że pracował dla mnie

Html.BeginForm("Profile", "Partner", routeValues: new {id=Partner.partner_id},method:FormMethod.Post) 

To było prawie jak tam był problem z przeciążenia metody, ale poprzez określenie, jakie rzeczy są, wydaje się działać dobrze .. .

+0

Dodanie parametrów ciągu zapytania do słownika routeValues ​​działa dla mnie. – munissor

+0

co jeśli chcę dodać klasę również do formularza, @using (Html.BeginForm ("actionName", "controllerName", routeValues: new {lang = "en"}, method: FormMethod.Post, htmlAttributes: new { @ class = "my-form", enctype = "multipart/form-data"})) –

2

użyciu reflektor spojrzeć na kodzie

BeginForm() przechodzi bezpośrednio rawUrl się do ostatecznej postaci. Wszelkie inne przeciążenia na BeginForm będą przechodzić przez narzędzie pomocnicze, które usunie ciąg zapytania.

0

Działa to dla mnie:

@using (Html.BeginForm("index", "Photos", routeValues: new { user = pUser, album = pAlbum, }, method: FormMethod.Get)) 

wartości Explicit trasy i sposobu jest to, co jest wymagane ...

0

Wystarczy okrywać chciał dodać inne atrybuty, jak również. użyć poniższego kodu:

@using (Html.BeginForm("actionName", "controllerName", routeValues: new { lang = "en" }, method:FormMethod.Post, htmlAttributes: new { @class= "my-form", enctype = "multipart/form-data" }))