【问题标题】:How can send html text box value with Url.Action to controller action method input argument?如何将带有 Url.Action 的 html 文本框值发送到控制器操作方法输入参数?
【发布时间】:2017-04-21 03:01:37
【问题描述】:

我是 asp.net mvc 的新手,想读取 html 文本框值并将其发送到控制器操作方法参数,为此在视图页面中编写以下代码:

<a href="@Url.Action("Item", "Store", new {parentPartId = @item.Id,UserID=12})">@item.BookName</a>


url action 在此段中:
UserID=html 文本框值
读取值并将其发送到控制器中的此操作:

public ActionResult Item(int parentPartId,int UserID)
        {
}


在视图页面中,我的文本框是这样的:

<input type="text" id="USERID"/>


我该如何解决这个问题?谢谢。

【问题讨论】:

  • 选项1:将文本框放入表单,并让用户提交表单(可能通过按钮),其“动作”将指向您提到的动作方法。这将导致文本框中的值作为参数传递给控制器​​。您必须确保文本框名称与参数名称匹配。选项 2:当用户点击链接时,使用一些 javascript 来收集文本框的值。在允许链接触发之前,使用它将值放入 URL。
  • @ADyson 如何使用选项 2?
  • 不要直接在链接上设置href。处理其点击事件。使用 preventDefault 来停止正常的重定向行为。创建一个包含 Url.Action 帮助程序值的变量,但将 @item.Id 更改为占位符字符串,例如“PARENT_ID”。获取生成的 URL 并使用字符串替换功能将 PARENT_ID 与文本框中的值进行切换。然后将用户重定向到这个新生成的 URL。
  • @ADyson 你能给我写代码吗?
  • 这些都是javascript中的标准基本任务,但是好的,我会给你一个例子。

标签: asp.net-mvc


【解决方案1】:

您需要通过模型/表单集合放置表单并发布您的数据

查看代码

@using (Html.BeginForm("SaveData", "TestCont", FormMethod.Post, new { Id = "frmTest", enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    <input type="text" id="USERID" name="UserID"/>
}

控制器:

[HttpPost]
[ValidateInput(false)]
public ActionResult SaveData(FormCollection form)
{
    string html = Convert.ToString(form["UserID"]);
}

请务必标记[ValidateInput(false)],否则会在发布 html 时引发错误

您可以在表单中放置一个提交按钮来发布它,或者在 JavaScript 中使用$('#frmTest').submit()

【讨论】:

  • enctype = "multipart/form-data" 在这里是不必要的,只有在上传文件时才需要。什么是“FormCollection”?此方法签名与 OP 的示例不同,您正在以一种奇怪的方式检索 UserID,无缘无故地绕过 MVC 模型绑定器。
  • 是的,如果您不上传任何文件,可以将其删除
  • 我不是小气,我只是指出有些事情我认为代码不正确,例如您绕过模型绑定器并抑制内置-在验证中 - 为什么要丢弃框架中内置的有价值的安全性和完整性检查功能?这种情况并没有什么奇怪的地方可以证明这一点,这是提交一些简单数据的非常标准的情况。
【解决方案2】:

您可以处理超链接的点击事件并将文本框中的值注入其中,如下所示:

HTML:

<a class="BookName" href="" data-id="@item.Id">@item.BookName</a>

脚本(假设你有 jQuery,但如果没有的话很容易重写):

$(".BookName").click(function(event)
{
  event.preventDefault();
  var url = '@Url.Action("Item", "Store", new {parentPartId = "PARENT_ID",UserID="USER_ID"})';
  url = url.replace("USER_ID", $("#USERID").val());
  url = url.replace("PARENT_ID", $(this).data("id"));
alert(url); //just for debugging
  window.location.href = url;
});

您可能希望在执行此操作之前检查输入值是否有效,但这将帮助您开始。

【讨论】:

  • 谢谢,我运行它并得到这个错误:参数字典包含方法'System.Web.Mvc.ActionResult'的不可空类型'System.Int32'的参数'UserID'的空条目'StoreProject.Controllers.StoreController' 中的项目(Int32,Int32)'。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数
  • @behibehi 你确定在点击之前在 USERID 文本框中写了一个数字吗?我在代码中插入了alert,这样我们就可以在提交之前检查该 URL 是否正确,如果有问题,最好将它的输出发布在这里以便我们检查它。
  • 控制台输出为:/Store/Item?parentPartId=1&UserID=
  • @OzanErtürk 在编程环境中“不孕”到底是什么意思?我不知道你在说什么。
  • @ADyson 是的 USERID 文本框在点击之前有一个数字值
【解决方案3】:

文本框值是动态的。这取决于用户输入。 Razor 标记在服务器上编译并发布到客户端。因此,您的 razor 代码无法理解用户将对您的文本区域做什么。您需要一个动作触发方法,包括确定文本框的值并发送到服务器。你可以使用ajax函数。 在 Jquery 的帮助下。

我认为@item 是一个循环变量。 你可以像下面这样改变你的代码

<a onClick="myFunction(@item.id)">@item.BookName</a>

如您所见,我捕获了 id 并作为参数输入。 这是您的文本区域

<input type="text" id="USERID"/>

这是获取文本框值并将其发送到您的操作的 javascript 函数

function myFunction(id){
    var userId = document.getElementById("UserID").value;
    var data ={
        parentPartId:id,
        UserID:userId
    }

    $.ajax({          //Jquery stuff
            url : '/Store/Item'
            type:'POST',
            data:data
            dataType:'json'
            success:function(){//You can handle succes scenario}
        });
}

查看数据的结构,它是一个 JSON 对象。参数名称与您的操作参数相同。当你发送它。 MVC 将理解逻辑并匹配参数和值。 )

【讨论】:

  • 这不会直接重现相同的行为 - ajax 请求与通过单击链接执行的重定向不同。如果您要给出一个需要 jQuery(.ajax 函数)的示例,为什么不使用 jQuery 语法来声明事件处理程序呢?内联事件通常被认为是不好的做法,jQuery 与否。此外,使用 URL.Action 确保生成正确的 URL,否则可能会根据 MVC 路由配置和部署环境的设置而出错。
  • 我编辑了关于 jquery 的帖子。另一方面,我认为不存在“生成”问题。为什么会这样?。
  • 就像我说的那样,如果使用的路由配置与默认配置不同,或者站点未部署到 IIS 网站/虚拟目录的根文件夹,则可能会出现问题。您不能假设获取 Action 的 URL 的公式总是那么简单。有很多关于 SO 的问题,人们在这方面遇到过问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多