2

我有查询字符串类。

  public class PagingModel
    {
        public int PageNumber { get; set; } = 1;
       
        public string Filter { get; set; } = "text";
    }

string url = "Menu/GetMenus";

我必须根据 ASP.NET Core 5 预览中的对象生成带有查询字符串的 URI。是否有任何内置的查询助手?

所需输出:

/Menu/GetMenus?PageNumber=3&Filter=text

MVC 控制器:

 public async Task<IActionResult> index_partial([FromQuery] PagingModel paging)
            {
              
                var data = await _apiService.GetMenusAsync(paging);
    
                return PartialView("_IndexPartial", data);
            }

服务:

   public async Task<PagedList<MenuModel>> GetMenusAsync(PagingModel paging)
            {
                string Requiredurl = "Menu/GetMenus?page="+ paging.PageNumber;
               
            }
4

2 回答 2

2

有了这么简单的查询字符串,我就可以做到

PagingModel qsData = new PagingModel();

//set qsData properties as needed 

string urlWithQueryString = $"/Menu/GetMenus?{nameof(PagingModel.PageNumber)}={qsData.PageNumber}&nameof(PagingModel.Filter)}={qsData.Filter}";

然而,更标准的是做类似的事情

string urlWithQueryString = this.Url.Action("GetMenus", "Menu", new PagingModel { PageNumber = 3, Filter = "text" }, this.Request.Url.Scheme);

但最佳解决方案取决于您的具体情况 - 您可以为 GetMenus 添加您的操作方法定义吗?

更新您的附加代码:

看起来您想在服务中生成 url,我只需这样做:

  public async Task<PagedList<MenuModel>> GetMenusAsync(PagingModel paging)
            {
                string Requiredurl =  $"/Menu/GetMenus?{nameof(PagingModel.PageNumber)}={paging.PageNumber}&nameof(PagingModel.Filter)}={paging.Filter}";

            }
于 2020-05-15T12:41:05.913 回答
1

我得到了这个扩展方法。不需要手动生成查询字符串。只有我们需要传递的类对象。我以为其他人可以使用相同的东西...

public static string AppendObjectToQueryString(string uri, object requestObject)
        {
            var type = requestObject.GetType();
            var data = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .ToDictionary
                (
                    p => p.Name,
                    p => p.GetValue(requestObject)
                );

            foreach (var d in data)
            {
                if (d.Value == null)
                {
                    continue;
                }

                if ((d.Value as string == null) && d.Value is IEnumerable enumerable)
                {
                    foreach (var value in enumerable)
                    {
                        uri = QueryHelpers.AddQueryString(uri, d.Key, value.ToString());
                    }
                }
                else
                {
                    uri = QueryHelpers.AddQueryString(uri, d.Key, d.Value.ToString());
                }
            }

            return uri;
        }

例如:就我而言,我是这样称呼的。

string uri = "Menu/GetMenus";
 string full_uri = QueryStringExtension.AppendObjectToQueryString(uri, paging);
于 2020-05-15T17:12:39.617 回答