【问题标题】:Why do I not have access to fields that are client side modified in my code behind?为什么我无法访问在我的代码后面修改的客户端字段?
【发布时间】:2021-04-27 21:09:57
【问题描述】:

我正在尝试在 JavaScript 中进行提取。我没有问题,可以得到我需要的价值。我需要将此值传递给后面的 C# 代码。我已经将值放在一个隐藏字段中,一个 div 来获取 innerHTML 和一个 textbox.value。我不知道发生了什么,但我似乎无法从 C# 访问这些数据。我有一个 asp:button 执行客户端脚本,然后执行后面的代码。每当客户端脚本返回 true 时,页面就会刷新。我尝试返回 false 并且正确的值保留在页面上,但它们在后面的代码中不可用,正在执行(我觉得很奇怪,因为我从客户端返回了 false)。我将我的各种尝试包括在内,以便您可以看到所有内容。

HTML:

<asp:TextBox runat="server" ID="secretTextBox" />
<asp:HiddenField runat="server" ID="secretHiddenField" />
<div id="testdiv" runat="server">This is a test.</div>
<asp:Button runat="server" ID="btnRunMOReport" class="button-dbg" Text="Run MO Report" OnClick="btnMO_Report_Click" OnClientClick="return validateCheckBoxesMO()" />

JavaScript:

// So this makes sure the page is valid and if so executes the fetch
function validateCheckBoxesMO() {
const result = validateMO();
if (result && document.getElementById("rbMOMap").checked) {
    fetch(
        "https://www.arcgis.com/sharing/generateToken?f=json&username=xxx&password=xxx&client=requestip"
    )
        .then((response) => response.json())
        .then((data) => {
            token = data.token;
            document.getElementById("secretTextBox").value = token;
            document.getElementById("testdiv").innerHTML = token;
        })
        // Garbage I know but I just wanted to force a false return but wait on the promise
        .then(finish => { return false });
} else {
    return result; // So this can return true but only if they are not getting the map.
    }
}

背后的代码(相关部分): 请注意,此时文本框和 div 都显示了我正在寻找的令牌。

这是我尝试从 DIV 中提取的地方:

var sb = new StringBuilder();
testdiv.RenderControl(new HtmlTextWriter(new StringWriter(sb)));
string s = sb.ToString().Remove(sb.ToString().Length - 6, 6);
s = s.Remove(0, 18);

s 等于“This is a test.”,这是页面加载时的内容,而不是当前在页面上显示的内容。

此时,一边查看调试器,一边secretTextBox.Text = "",secretHiddenField.Value = ""。

我已经尝试了好几天了,并尝试了不同的方法来传递这个值。我似乎做不到。除非我想重写整个应用程序,否则 MVC 并不是一个真正的选择。我觉得我错过了一些非常基本的东西,我无法弄清楚。感谢您提供任何帮助。

看来我可能需要从后面的代码中获取,但我在 C# 方面并不那么复杂。如果这似乎是一个选项,我会接受的。

【问题讨论】:

  • 如果您使用调试器跟踪您的 javascript,您将看到 document.getElementById("secretTextBox") 找不到该元素。改用 name 属性来识别它们,因为 ASP.NET 服务器会更改您的 ID。
  • 我对您将 DIV 呈现为 StringBuilder 的代码感到困惑。如果该值存储在隐藏字段中,则从隐藏字段中读取它。如果它没有存储在隐藏字段(或其他 HTML 输入元素)中,则它对后面的代码不可用,因为它不是通过网络发送的。
  • Dave,页面在文本框中呈现令牌。这向我表明文本框已被更改,但它不存在于后面的代码中。
  • 约翰,我正试图将 DIV 读入后面的代码中。字符的剥离只是为了让
    脱离字符串。它读取页面加载时 div 中的值,但不读取 div 中清晰显示的标记。
  • 我猜我昨天累了。我也试过 secretHiddenField.value = token;后面两个文件语句还没有在代码后面,secretHiddenField.value = "";

标签: javascript c# html


【解决方案1】:

好吧,我成功了。我创建了一个运行我的 JavaScript 的 HTML 按钮。我阻止了默认行为,因此它不会回发。然后,当按下服务器按钮时,字段就在那里。这很丑陋,但它有效。如果我阻止了客户端单击时的默认行为,我将不会收到我需要的帖子。我仍然认为这可以通过一个按钮完成,但我无法做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多