2011-09-06 37 views
27

url của tôi trông như thế này:Sử dụng Html.BeginForm với chuỗi truy vấn

customer/login?ReturnUrl=home 

Trong giao diện đăng nhập, tôi đã sử dụng mẫu mã này mà hoạt động tốt.

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

này html kỳ diệu tạo sau

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

Nhưng bây giờ, tôi cần phải thêm một thuộc tính (ví dụ, data-id="something") trong biểu mẫu. Làm thế nào tôi có thể làm điều đó? Nếu tôi không có bất kỳ chuỗi truy vấn, tôi biết tôi có thể làm điều gì đó như thế này:

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

Nhưng không biết làm thế nào để thêm chuỗi truy vấn mà phải ở trong html:

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

tôi nghĩ về việc sử dụng trực tiếp <form> nhưng không biết cách chỉ định chuỗi truy vấn có thể thay đổi. Và tôi không có ý tưởng làm thế nào để đạt được nó với Html.BeginForm. Bất kỳ mẹo nào cũng sẽ được đánh giá cao.

NGHỊ QUYẾT:

Còn bây giờ, tôi đã sử dụng <form> với sau gợi ý How to get current url value in View. Chế độ xem kết quả trông giống như

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

Nhưng sẽ tốt hơn nếu có phương pháp quá tải BeginForm cho điều này.

+0

bạn muốn thêm thuộc tính vào biểu mẫu hoặc nội dung nào trong biểu mẫu? – msarchet

+0

Bạn đang tìm cách thêm một giá trị biểu mẫu khác hoặc để tự động đặt chuỗi truy vấn? – Tejs

+0

@msarchet và Tejs Tôi muốn thuộc tính trên phần tử biểu mẫu. –

Trả lời

15

Tôi đoán điều này không trực tiếp trả lời câu hỏi, nhưng tại sao không chỉ sử dụng một thẻ dạng cũ đơn giản?

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

Hoặc, bạn có thể tạo tùy chỉnh HtmlHelperExtension biểu hiện biểu mẫu có đường dẫn và chuỗi truy vấn. Trong HtmlHelperExtension này bạn có thể lặp qua các giá trị chuỗi truy vấn của bạn và điền routeValueDictionary mà sau đó bạn chuyển đến một hàm tạo Html.BeginForm.

Nếu bạn không muốn một cái gì đó để có thể mở rộng bạn chỉ có thể sử dụng các nhà xây dựng quá tải của Html.BeginForm sử dụng @Html.BeginForm("login", "customer", new {ReturnUrl = @Request.QueryString["ReturnUrl"]},FormMethod.Post, new {data-id="something"});

+0

Tôi vừa nhận thấy bạn đã chỉnh sửa câu hỏi của bạn với ý tưởng đầu tiên. – arviman

+0

Nhưng nếu tôi thêm một chuỗi truy vấn khác, tôi phải thay đổi lại mã. Tôi có câu trả lời hay hơn, vui lòng xem phần cuối cùng của câu trả lời cập nhật của tôi. Cảm ơn câu trả lời của bạn. –

+0

Bạn được chào đón. Tôi đã cập nhật câu trả lời của mình cũng như sử dụng một hàm tạo của chính BeginForm. – arviman

0

Hãy thử @using(Html.BeginForm(null, null, FormMethod.Post, new { data_id="something" }))

Nó nên sử dụng logic mặc định để xây dựng các url, cũng giống như khi bạn sử dụng BeginForm()

(không bao giờ cố gắng mà mặc dù trong trường hợp như vậy, nhưng tôi tin rằng nó sẽ làm việc)

+1

Tôi đã thử nó nhưng hình thức kết quả có 'action ="/customer/login "'. Nó sẽ là '/ customer/login? ReturnUrl = home' –

+0

Thật không may, nó không bảo tồn chuỗi truy vấn khi truyền null cho các tham số hành động và bộ điều khiển. – spikyjt

17

Để tạo một RouteValueDictionary từ chuỗi truy vấn:

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

Sau đó, bạn có thể sử dụng với Html.BeginForm:

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

Dưới đây là Cách mà làm việc cho tôi

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

Đó là gần giống như có một vấn đề với quá tải phương pháp, nhưng bằng cách xác định những gì đang có, nó dường như làm việc tốt .. .

+0

Việc thêm các tham số chuỗi truy vấn trong từ điển routeValues ​​hoạt động cho tôi. – munissor

+0

điều gì sẽ xảy ra nếu tôi muốn thêm lớp vào biểu mẫu, @using (Html.BeginForm ("actionName", "controllerName", routeValues: new {lang = "en"}, phương thức: FormMethod.Post, htmlAttributes: new { @ class = "my-form", enctype = "multipart/form-data"})) –

2

sử dụng Trình phản xạ để xem mã,

BeginForm() sẽ chuyển trực tiếp rawUrl qua biểu mẫu cuối cùng. Bất kỳ quá tải nào khác trên BeginForm sẽ đi qua một tiện ích trợ giúp sẽ xóa chuỗi truy vấn.

0

này làm việc cho tôi:

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

giá trị đường Explicit và phương pháp là những gì được yêu cầu ...

0

Chỉ trong trường hợp bạn muốn thêm các thuộc tính khác nữa. sử dụng mã bên dưới

@using (Html.BeginForm("actionName", "controllerName", routeValues: new { lang = "en" }, method:FormMethod.Post, htmlAttributes: new { @class= "my-form", enctype = "multipart/form-data" })) 
Các vấn đề liên quan