ASP.NET MVC-얻 Html.BeginForm()기억하는 쿼리 문자열 params 를 통해 제출할 때에 얻

StackOverflow https://stackoverflow.com/questions/1219223

  •  10-07-2019
  •  | 
  •  

문제

나는 형태로 렌더링을 통해 Html.BeginForm(),그것은 존재로 구성요소에서 페이지도록 모든 페이지에 나타납니다.내가 이를 사용하여 Html.RenderAction()에서 Mvc 선물이 어셈블리입니다.그것은 간단한 검색 양식을 업데이트되는 일부 품목에서 동일한 구성 요소 underneigh 검색 형태 그 자체를 수행하고 얻을 수 있도록 검색 기간에 나타납니다 쿼리 문자열.

<div class="sideBarContent">
   <h2>Search Products</h2>

   <% using (Html.BeginForm(ViewContext.RouteData.Values["action"].ToString(),
         ViewContext.RouteData.Values["controller"].ToString(), FormMethod.Get)) { %>

      <fieldset>
         <legend>Search Products</legend>

         <div class="formRow">
            <label for="ProductsSearch">Search</label>
            <%= Html.TextBox("ProductsSearch") %>
         </div>

         <input type="submit" value="Search" class="button" />
       </fieldset>

   <% } %>

   <ul>
      // Products will eventually be listed here
   </ul>
</div>

요 이 양식은 다음 작업을 수행:

1)을 수행해야 합 얻을 무엇이든 현재 페이지의 그것에 추가하여'ProductsSearch'으로서 쿼리 문자열을 매개 변수(예를 들어. example.com/?ProductsSearch=testexample.com/books/fiction?ProductsSearch=test)

2)그것을 기억해야 어떤존 쿼리 문자열 변수에 이미 있는 쿼리 문자열을 유지하고,그 후 검색 버튼을 클릭합니다. example.com/myOrders?page=2 후에는 검색을 클릭으로 이동해야한 example.com/myOrders?page=2&ProductsSearch=test)

나는 그것을 얻을 수 있습니다 1)이지만 작동할 수 없 2).

I relise 는 일반적으로 위해를 얻기 위해 추가하는 쿼리 문자열 파라미터가 필요하고 숨겨진 형태의 필드는,그래서 내가 쓸 수 있는 유틸리티 기능을 자동으로 추가하는 무리의 숨겨진 형태 분야에 대한 모든 쿼리 문자열 값을,하지만 제가 확인하고 싶어가지 않았다 쉽게 접근,또는 어쩌면 나는 그것에 대해 잘못된 방법입니다.

Cheers!

도움이 되었습니까?

해결책

숨겨진 양식 필드 방법을 수행해야합니다.

전체 쿼리 스트링을 URL의 끝에 첨부 할 수 있더라도u003Cform> 태그, 브라우저는 양식 제출을 할 때 이에주의를 기울이지 않습니다.

당신의 방법은 그리 어렵지 않습니다. 당신은 다음과 같은 일을하고 싶을 것입니다.

public static string QueryStringAsHidden(this HtmlHelper helper)
{
    var sb = new StringBuilder();
    foreach (var key in HttpContext.Current.Request.QueryString.AllKeys)
    {
        if (! key.StartsWith("ProductSearch"))
            sb.Append(helper.Hidden(key, HttpContext.Current.Request.QueryString[key]));
    }
        return sb.ToString();
    }

검색 페이지에 있고 검색 문자열을 두 번 제출하고 싶지 않기 때문에 .startswith ()를 거기에 넣었습니다.

편집 : PS : 양식을 현재 페이지에 게시 할 수 있도록 작업 및 컨트롤러를 명시 적으로 제공 할 필요가 없습니다. Nulls를 보낼 수도 있습니다.

edit2 : 왜 도우미 방법으로 귀찮게합니까? :)

<% HttpContext.Current.Request.QueryString.AllKeys.Where(k => !k.StartsWith("ProductSearch")).ToList().ForEach(k => Response.Write(Html.Hidden(k, HttpContext.Current.Request.QueryString[k]))); %>

제임스

다른 팁

direct to call beginform ()은 쿼리 문자열 값을 유지합니다. 다른 과부하는 실패하는 경향이 있습니다. 나는 내 양식에서 beginform ()을 사용하는 것이 용이하지만, 모든 스타일 형식을 특정 방식으로 클래스하는 방법이 필요합니다.

다음은 다음과 같이 생각해 냈습니다.

public static MvcForm BeginNormalForm<T>(this HtmlHelper<T> htmlHelper)
{
    var dictionary = new Dictionary<string, object> {{"class", "normal"}};
    var rvd = new RouteValueDictionary();
    if (htmlHelper.ViewContext.HttpContext != null && htmlHelper.ViewContext.HttpContext.Request != null)
    {
        foreach (var key in htmlHelper.ViewContext.HttpContext.Request.QueryString.AllKeys)
        {
            rvd[key] = htmlHelper.ViewContext.HttpContext.Request.QueryString[key];
        }
    }
    var form = htmlHelper.BeginForm(null, null, rvd, FormMethod.Post, dictionary);
    return form;
}

잘 작동하고 내 클래스 속성을 유지하는 것 같습니다.

중 하나를 사용의 오버로드 BeginForm 는 routeValues 체는 사전.

추가적인 속성에 있지 않는 경로로 추가됩니다 쿼리를 매개 변수입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top