4

URL の例 http_//host/url/unlimited/index?first=value1&second=value2...&anyvalidname=somevalue

不明な名前のパラメーターの量を事前に受け入れる1つのアクションが必要です。このようなもの:

public class UnlimitedController : Controller
{
    public ActionResult Index(object queryParams)
    {

    }

    //or even better
    public ActionResult Index(Dictionary<string, object> queryParams)
    {

    }
}
4

6 に答える 6

4

クエリ文字列を辞書に変換するカスタム モデル バインダーを作成できます。

カスタムモデルバインダー

  public class CustomModelBinder: IModelBinder
  {
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
      var querystrings = controllerContext.HttpContext.Request.QueryString;

      return querystrings.Cast<string>()
        .Select(s => new { Key = s, Value = querystrings[s] })  
        .ToDictionary(p => p.Key, p => p.Value);
    }
  }

アクション

public ActionResult Index([ModelBinder(typeof(CustomModelBinder))]
   Dictionary<string, string> queryParams)
{

}
于 2012-07-10T04:09:44.377 に答える
1

HomeController.cs

public ActionResult Test()
{
    Dictionary<string, string> data = new Dictionary<string, string>();
    foreach (string index in Request.QueryString.AllKeys)
    {
        data.Add(index, Request.QueryString[index]);
    }

    StringBuilder sb = new StringBuilder();
    foreach (var element in data)
    {
        sb.Append(element.Key + ": " + element.Value + "<br />");
    }

    ViewBag.Data = sb.ToString();
    return View();
}

Test.cshtml

<h2>Test</h2>
@Html.Raw(ViewBag.Data)

Webページ、、http://localhost:35268/Home/Test?var1=1&var2=2次のことを示しています。

var1: 1
var2: 2
于 2012-07-10T00:45:53.683 に答える
0

必要なものすべてを単一のクエリ文字列パラメーター内に保持し、サーバー側で文字列として取得してから
、文字列 urself を解析し、
このようなものを取得し
http://example.com?a=someVar&b=var1_value1__var2_value2__var3_value3
てから、サーバー側で文字列を分割して変数とすべてを取得しないでください。値

が必要ない場合は
、URLを介してコントローラーを呼び出し、手動でRequest.QueryString[]コレクションに入るだけで、すべての変数とそこにある値を取得できます

于 2012-07-09T22:55:55.703 に答える
0

あなたのコントローラーコードは次のようになります

  public ActionResult MultipleParam(int a, int b, int c)
            {
                ViewData["Output"] = a + b + c;
                return View();
            }

Global.asax.cs

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

                       routes.MapRoute(
                "Parameter",
                "{controller}/{action}/{a}/{b}/{c}",
                new { controller = "Home", action = "MultipleParam", a = 0, b = 0, c = 0 }
        );

        }

ルートが {controller}/{action}/{id}/{page} で、/Home/MultipleParam/101/1?showComments=true の場合、取得メカニズムは次のようになります。

public ActionResult MultipleParam(string id /* = "101" */, int page /* = 1 */, bool showComments /* = true */) { }
于 2012-07-09T22:59:44.157 に答える
0

HttpContextを使用してクエリ文字列を収集するだけです。

using System.Web;

public class UnlimitedController : Controller
{
    public ActionResult Index(object queryParams)
    {

    }

    //or even better
    public ActionResult Index()
    {
         NameValueCollection queryString = HttpContext.Request.QueryString;
         // Access queryString in the same manner you would any Collection, including a Dictionary.
    }
}

質問は、「クエリ文字列から無制限の量のパラメーターを受け入れる ASP.NET MVC コントローラーを作成する方法」ですか? どのコントローラーも、無制限の量のパラメーターを として受け入れますNamedValueCollection

于 2016-03-03T06:19:25.843 に答える
0

別の可能な解決策は、カスタムルートを作成することです

public class ParamsEnabledRoute : RouteBase
{
    private Route route;

    public ParamsEnabledRoute(string url)
    {
        route = new Route(url, new MvcRouteHandler());
    }

    public override RouteData GetRouteData(HttpContextBase context)
    {
        var data = route.GetRouteData(context);
        if (data != null)
        {
            var paramName = (string)data.Values["paramname"] ?? "parameters";
            var parameters = context.Request.QueryString.AllKeys.ToDictionary(key => key, key => context.Request.QueryString[key]);
            data.Values.Add(paramName, parameters);
            return data;
        }
        return null;
    }

    public override VirtualPathData GetVirtualPath(RequestContext context, RouteValueDictionary rvd)
    {
        return route.GetVirtualPath(context, rvd);
    }
}

使用法:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.Add(new ParamsEnabledRoute("ParamsEnabled/{controller}/{action}/{paramname}"));
    }

コントローラ:

public class HomeController : Controller
{
    public ActionResult Test(Dictionary<string, string> parameters)
    {
    }
}

URL:

http://localhost/ParamsEnabled/Home/Test/parameteres?param1=value1&param2=value2

ルート属性:

public class RouteDataValueAttribute : ActionMethodSelectorAttribute
{
    private readonly RouteDataValueAttributeEnum type;

    public RouteDataValueAttribute(string valueName)
        : this(valueName, RouteDataValueAttributeEnum.Required)
    {
    }

    public RouteDataValueAttribute(string valueName, RouteDataValueAttributeEnum type)
    {
        this.type = type;
        ValueName = valueName;
    }

    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        if (type == RouteDataValueAttributeEnum.Forbidden)
        {
            return controllerContext.RouteData.Values[ValueName] == null;
        }
        if (type == RouteDataValueAttributeEnum.Required)
        {
            return controllerContext.RouteData.Values[ValueName] != null;
        }
        return false;
    }

    public string ValueName { get; private set; }
}

public enum RouteDataValueAttributeEnum
{
    Required,
    Forbidden
}
于 2012-07-10T14:48:19.110 に答える