MVC中从输入框传数据到控制器报错求助
你的问题核心在于混淆了服务器端代码和客户端代码的执行时机,导致视图里的name变量报错,下面详细解释并给出可行方案:
为什么会报错?
你写的@Url.Action("Wynik", "Home", new { name = name })是服务器端代码,它在页面被发送到浏览器之前就执行了。这时候用户还没在输入框里输入任何内容,服务器根本不知道你说的第二个name是什么——这个变量在服务器端没有定义,自然会抛出错误。
服务器端代码无法直接获取客户端输入框的实时值,必须通过客户端交互(比如表单提交、JavaScript)来传递数据。
解决方案1:使用表单提交(推荐,符合MVC规范)
这是最标准的方式,把输入框和按钮放在表单里,让浏览器自动处理数据传递:
<form action="@Url.Action("Wynik", "Home")" method="get"> <!-- 注意:输入框的name属性要和控制器方法的参数名一致(这里是name) --> <input type="text" id="wprowadz" name="name"/> <input type="submit" value="Create" /> </form>
原理:
点击提交按钮时,浏览器会把表单里所有带name属性的元素的值,按照表单指定的action地址发送到控制器。因为输入框的name是name,和控制器方法的参数string name完全匹配,ASP.NET MVC会自动把值绑定到参数上。
如果不想修改输入框的name(比如保留imie),可以修改控制器方法的参数名,或者用特性指定参数来源:
// 修改参数名和输入框name一致 public string Wynik(string imie) { return imie; } // 或者用特性映射 public string Wynik([FromQuery(Name = "imie")] string name) { return name; }
解决方案2:用JavaScript动态生成跳转URL
如果你坚持要用按钮的onclick跳转,需要通过JavaScript获取输入框的实时值,再拼接成完整的URL:
<input type="text" id="wprowadz" name="name"/> <input type="button" value="Create" onclick="navigateToWynik()" /> <script> function navigateToWynik() { // 获取输入框的值 const inputValue = document.getElementById('wprowadz').value; // 用服务器端生成的基础地址,拼接参数(encodeURIComponent处理特殊字符) const baseUrl = '@Url.Action("Wynik", "Home")'; const fullUrl = `${baseUrl}?name=${encodeURIComponent(inputValue)}`; // 跳转页面 window.location.href = fullUrl; } </script>
注意:
encodeURIComponent非常重要,它会把输入中的特殊字符(比如空格、中文、&等)转成URL安全的格式,避免出现URL解析错误。
总结
你的核心错误是试图在服务器端代码中引用客户端的实时输入值,这两者的执行时机完全不同。选择表单提交(推荐)或JavaScript动态拼接URL,就能解决问题啦。
内容的提问来源于stack exchange,提问作者Radziu

