0

我想更好地理解为 url 设置新参数并通过检索它的问题

var ParaValue = Request.QueryString["parameterName"];

所以如果我有一个 URL:“http://www.myWebsite.aspx?UserName=Alice”

我将通过上面的示例检索它

string uName = Request.QueryString["UserName"].ToString();

但是如果我想改变值怎么办,例如 make UserName = "Ralf"

  • 重新编辑

当按下按钮时,有一个参数“state”包含对按下的按钮的引用 state 的值是 =“none”,现在我想将其设置为 img_button1。

我什至没有发送实际的 imgbutton id

我只是为了测试/参考而对其进行硬编码

所以我可以知道我正处于按钮1给定事件的过程所要求的事件阶段

当事件由img_button2

然后我想将状态设置为“img_button2”等

4

3 回答 3

3

在我进行研究之后(我无法在我的帖子中标记任何答案)然后我测试了我在这个 Stack Overflow Page中遇到的两个选项:

第一个选项(由 Ahmad Mageed 提供)我已经测试过可以正常工作。并且可读性很容易理解(因为我对 asp.net 'tricks'仍然很陌生)

然后跟着 annakata 的回答,这是一种显着改进的方法,您实际上不必重定向即可获得结果 - 查询字符串已修改

在玩耍之后,我决定遵循annakata的方法并制作一个辅助方法,该方法也使用带有修改后的 QueryString 参数和值的 redirerion 选项。

public void QuerStrModify(string CurrQS_ParamName, string NewQs_paramName, string NewPar_Value, bool redirectWithNewQuerySettings = false)
{

    // reflect to readonly property 
    PropertyInfo isReadOnly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

    // make collection editable 
    isReadOnly.SetValue(this.Request.QueryString, false, null);

    // remove 
    this.Request.QueryString.Remove(CurrQS_ParamName);

    // modify 
    this.Request.QueryString.Set(NewQs_paramName, NewPar_Value);

    // make collection readonly again 
    isReadOnly.SetValue(this.Request.QueryString, true, null);
    string FullUrl = Request.Url.AbsolutePath;
    if (redirectWithNewQuerySettings)
    {
        Response.Redirect(string.Join("?", FullUrl, this.Request.QueryString));
    }

}

我发现它对那些在 asp.net developmentmet 方面经验相当少的人很有帮助,所以我将它作为我的正确答案版本发布,正如我所见。我希望它能帮助寻求相同解决方案的其他人。

随意进一步改进它,正如我提到的那样,我还不是一个成熟的人才。

于 2012-09-24T09:25:14.377 回答
0

您可以使用HttpModule

public class SimpleRewriter : System.Web.IHttpModule
{

    HttpApplication _application = null;

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new System.EventHandler(context_BeginRequest);
        _application = context;
    }

    public void Dispose()
    {
    }

    private void context_BeginRequest(object sender, System.EventArgs e)
    {
        string requesturl =
            _application.Context.Request.Path.Substring(0,
                _application.Context.Request.Path.LastIndexOf("//")
            );

        string[] parameters = requesturl.Split(new char[] { '/' });

        if (parameters.Length > 1)
        {
            string firstname = parameters[1];
            string lastname = parameters[2];


            //Here you can modify your parameters or your url

            _application.Context.RewritePath("~/unfriendly.aspx?firstname=" +
                firstname + "&lastname=" + lastname);

        }
    }
}

链接:http: //msdn.microsoft.com/en-us/library/ms972974.aspx

注册:

<configuration>
  <system.web>
    <httpModules>
      <add name="SimpleRewriter" type="SimpleRewriter"/>
     </httpModules>
  </system.web>
</configuration>

链接:http: //msdn.microsoft.com/en-us/library/ms227673%28v=vs.100%29.aspx

于 2012-09-22T15:04:07.530 回答
0

这里的问题是“真相的来源”问题。HttpRequest.QueryString公开的NameValueCollection公开了查询字符串,不应修改,因为查询字符串是由调用方提供的。如果应用程序有一个 UserName 查询字符串参数,但可能需要更改它(例如为了测试),请将其包装在一个方法中,以便在需要时将其从备用源中获取。例如:

// A very simple container
public static class SystemInfo
{
    // This would be an instance of QueryStringUserInfo
    // by default but could be changed for testing.
    public IUserInfo UserInfo
    {
        get;
        private set;
    }
}

// An interface that contains the user operations 
public interface IUserInfo
{
    string UserName { get; }
}

// Get the user name from the query string. This would
// be the default.
public class QueryStringUserInfo: IUserInfo
{
    public string UserName
    {
        get
        {
            return Request.QueryString["UserName"].ToString();
        }
    }
}

// Get the user name from the query string. This would
// be the default.
public class TestUserInfo: IUserInfo
{
    public string UserName
    {
        get
        {
            return "Foo";
        }
    }
}

因此,不要直接为用户名(或任何一条信息)调用 QueryString,而是调用 SystemInfo 上的属性(可怕的名字,但你明白了)。它允许更改设置的来源,例如代码是否用于网页之外或用于测试。

于 2012-09-22T15:05:30.113 回答