我有一个URL也可能有一个查询字符串部分,查询字符串可能是空的或有多个项目.
我想替换查询字符串中的一个项目,或者如果该项目尚不存在则添加它.
我有一个带有完整URL的URI对象.
我的第一个想法是使用正则表达式和一些字符串魔法,应该这样做.
但它似乎有点摇摇欲坠,也许框架有一些查询字符串构建器类?
我们从另一家公司继承了一些C#代码作为项目的一部分,该公司执行URL重定向,根据需要修改现有查询字符串,更改项目值,添加新参数等.但问题是代码充其量只是错误,最终会复制查询字符串中的项目而不是正确更新它们.该代码适用于第一次通过,但在其他调用时,重复问题变得明显.
例如:MyPage.aspx?startdate = 08/22/09&startdate = 09/22/09
它不需要复制项目,而是需要使用新值(如果已存在)进行更新,或者如果不存在则添加.
是否有一个C#类或一组函数来处理查询字符串,允许一种简单的方法来访问和更新/添加解决这些问题的参数,而不是现在似乎在使用代码的盲添加方法?这需要能够处理可能始终存在或不存在的多个参数,并在后续调用中添加和更新.
我们将尽快使用现有逻辑,而不是在可能的情况下重新创建某些内容,以便以半标准方式快速解决此问题,以便将来进行可维护性和重用.
我的存储桶上设置了以下存储桶策略:
{
"Version": "2008-10-17",
"Id": "My access policy",
"Statement": [
{
"Sid": "Allow only requests from our site",
"Effect": "Allow",
"Principal": { "AWS": "*"},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/*",
"Condition": {
"StringLike": {
"aws:Referer": [" http://mydomain.com/*"," http://www.mydomain.com/*"]
}
}
},
{
"Sid": "Dont allow direct acces to files when no referer is present",
"Effect": "Deny",
"Principal": {"AWS": "*" },
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/*",
"Condition": {
"Null": {"aws:Referer": true }
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
我还配置了查询字符串身份验证,但看起来我不能同时拥有它们.如果我将我的存储桶策略设置为拒绝任何不是源自mydomain的请求,则使用查询字符串身份验证的临时URL也将无法提供.所以我的问题是,我怎么能同时拥有这两个?有没有办法检查url参数,看看它是否有一个名为"Signature"的参数,在这种情况下不应用引用策略?
我创建了一个相当直接的页面,其中包含一个复选框:
@using (Html.BeginForm("MyController", "MyAction", FormMethod.Get))
{
@Html.CheckBoxFor(x => x.MyCheckBox)
<input type="submit" value="Go!" />
}
Run Code Online (Sandbox Code Playgroud)
URL填充MyCheckBox值两次!?因此:
MyAction?MyCheckBox=true&MyCheckBox=false
Run Code Online (Sandbox Code Playgroud)
如果复选框为true,它仅复制值.如果设置为false,它将仅在查询字符串中出现一次.
上面的代码是简化的,因为我有一些下拉菜单和表单上的文本框工作正常.我不认为我从这个问题中遗漏的代码有什么不寻常之处.
有没有人有类似的问题与查询字符串参数重复?
当我从System.Web使用HttpUtility时,我发现每次调用方法.ParseQueryString我都有特殊的字符编码到他们的unicode等效表示.我尝试了许多不同的编码类型,似乎都产生了相同的结果.我的代码示例如下:
string text = "ich möchte diese Bild für andere freigeben"
var urlBuilder = new UriBuilder(url);
var query = HttpUtility.ParseQueryString(urlBuilder.Query, Encoding.UTF8);
query["text"] = text;
urlBuilder.Query = query.ToString();
string finalUrl = urlBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)
finalUrl我将从中收到的字符串将是:
文本= ICH + M%u00f6chte + diese +图片报+ F%u00fcr + ANDERE + freigeben
我尝试过使用Encoding.UTF8,Encoding.ASCII并且Encoding.Default它们都产生相同的结果.我该怎么做才能达到我想要的UrlEncoding格式:
文本= ICH%20米%C3%B6chte%20diese%20Bild%20F%C3%BCR%20andere%20freigeben
一如既往,提前感谢您的帮助/建议!
嗨,我正在尝试将我当前的URL存储在会话变量中.
我的应用使用了www.domain.com/add?url=http://www.google.com等查询字符串
但是current_url()返回'ww.domain.com/add'.没有查询字符串的网址.
我检查了帮助文件,current_url似乎只是将uri段附加到配置中设置的site_url.
function current_url()
{
$CI =& get_instance();
return $CI->config->site_url($CI->uri->uri_string());
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道我如何抓住查询字符串来追加它们,甚至只是抓住整个网址.
我正在阅读历史,我希望当我遇到谷歌查询时,我可以提取查询字符串.我没有使用请求或httputility,因为我只是解析一个字符串.但是,当我遇到这样的URL时,我的程序无法正确解析它:
我试图做的是得到q =的索引和&的索引,并取两者之间的单词,但在这种情况下,&的索引将小于q =,它会给我错误.
有什么建议?
谢谢你的答案,一切似乎都很好:) ps我不能使用httputility,不是我不想.当我添加对system.web的引用时,不包括httputility!它只包含在asp.net应用程序中.再次感谢
使用aurelia.io框架路由器时,读取和设置查询字符串的首选方法是什么?
例如,在网址中: http://www.myapp.com/#/myroute1/?s=mystate
我如何阅读和设置?s=mystate网址的一部分并让aurelia路由器正确导航并记住该状态,这样每当我到达我的route1viewmodel时,我都可以读取该状态变量并对其执行某些操作?
javascript query-string aurelia aurelia-navigation aurelia-router
我有一个Web API方法:
public List<Task> GetTasks([FromUri] TaskFilter filter)
{
}
Run Code Online (Sandbox Code Playgroud)
该方法具有带可空标识符列表的参数:
public class TaskFilter
{
public IList<int?> Assignees { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我打电话的时候:
GET /tasks?assignees=null
Run Code Online (Sandbox Code Playgroud)
服务器返回错误:
{
"message":"The request is invalid.",
"modelState": {
"assignees": [ "The value 'null' is not valid for Nullable`1." ]
}
}
Run Code Online (Sandbox Code Playgroud)
它只有在我传递空字符串时才有效:
GET /tasks?assignees=
Run Code Online (Sandbox Code Playgroud)
但是标准查询字符串转换器(来自JQuery, Angular等)不能以这种方式使用空值.
如何让ASP.NET解释'null'为null?
Upd:查询字符串可以包含多个标识符,例如:
GET /tasks?assignees=1&assignees=2&assignees=null
Run Code Online (Sandbox Code Playgroud)
Upd2: JQuery将数组中的空值转换为空字符串,ASP.NET将它们解释为null.所以问题是从Angular 1.6($HttpParamSerializerProvider)调用WebAPI
Upd3:我知道解决方法,但我没有要求它们.我想要一个特定问题的解决方案:
null值List<int?>因为API文档是自动生成的,我不希望将文本数组视为参数类型JQuery.param …我的 Next.js 应用程序上有一个页面执行以下操作:
/search?q=search+slugrouter.query来获取router.query.q值PS:我正在使用Redux
const dispatch = useDispatch();
const router = useRouter();
const query = router.query as { q: string };
const queryString = query.q;
console.log("SEARCH CONTAINER");
console.log(`queryString: ${queryString}`);
useEffect(() => {
dispatch(THUNK.LOAD(queryString));
return () => { dispatch(ACTION.RESET_STATE()); };
},[dispatch,queryString]);
Run Code Online (Sandbox Code Playgroud)
请参阅useEffect. 理论上应该只为每个运行一次queryString(实际上是req.query.q)。
但我得到了重复的THUNK.LOAD动作。这就是为什么我console.log()在那里添加了。
这就是它注销的内容:
进而:
这就是为什么我收到重复的派遣的原因。当然我可以if (queryString)在发货前检查一下,或者也许我可以从 获取window.location.search。但令我惊讶的是,它一开始router.query.q就出现了。undefined这怎么可能呢?为什么要req.query异步填充对象?对此有何解释?