通过组合动作链接和 ASP.Net MVC 5 中的输入将用户键入的输入从视图传递到动作控制器?

Posted

技术标签:

【中文标题】通过组合动作链接和 ASP.Net MVC 5 中的输入将用户键入的输入从视图传递到动作控制器?【英文标题】:Passing a user-typed input from View to Action Controller via combined action link and input in ASP.Net MVC 5? 【发布时间】:2016-09-17 17:25:17 【问题描述】:

这是一个ASP.Net MVC 5 项目。

我已阅读以下有用的帖子:

ASP.Net MVC How to pass data from view to controller

其中解释了如何将数据从View 传递到ASP.Net MVC 中的Controller。帖子中的主要思想是

    View 中使用匹配模型表单发布(输入)和Action Controller 中的名称约定参数,或者 创建一个操作链接,其中我们有一个匿名对象,其名称约定参数为route values,与Action Controller 中的参数匹配。

现在我这里有一个稍微不同的案例......并且想获得一些解决方法。

与上面的方法 (2) 类似,我已经有一个匿名对象的操作链接,该对象具有使用 razor 动态生成的名称约定参数,如下所示:

@html.ActionLink("Detail", item.DetailsName, item.ControllerName,
  new 
    pid = item.Pid, eid = item.Eid, mid = item.Mid, cid = item.Cid,
    manNo = item.TypeItem == "Create" ? item.ManCreateNo : item.ManEditNo,
    caneNo = item.TypeItem == "Create" ? item.CaneCreateNo : item.CaneEditNo,
    command = userCanAccept ? "acc" : "pass", from = ViewBag.From
  , null)

ActionLink 调用的(可能的)对应的Action Controller 如下所示:

public ActionResult DetailsChange(int pid, int eid, int mid, int cid, int manNo = 1, int caneNo = 1, string command = null, string from = null, string comment = null)

现在,如您所见,View 中的Action Link 参数和ControllerAction Controller 的参数完美匹配,除了comment.

View 可以在渲染时由 razor 渲染所有其他参数,但 comment 应该是用户键入的输入(文本)。

现在,当按下Action Link 时,如何将这个commentView 与其余参数一起传递给ControllerASP.Net MVC 5 中是否有解决此问题的方法?

【问题讨论】:

为什么不能在 ActionLink 的匿名对象参数中传递comment?? 您需要提供有关您的方案的更多信息。您的方法建议您更改/更新数据,这意味着它应该是 POST,而不是 GET。您在视图中引用item 的事实表明您在循环中生成它,这将产生更多问题。为什么要发回所有这些额外的参数,而不仅仅是项目 ID 和 cmets? @Fourat 因为在渲染时评论是未知的。该评论在用户输入后才知道。 @StephenMuecke 我需要动作中的所有这些额外参数。假设我们不能把它放在链接中,我想知道是否有办法与其他人一起传递评论参数。 您不应该需要所有这些参数(您的控制器将它们发送到视图,而您只需将它们全部原封不动地再次发送回去 - 您最好将对象 ID 连同评论一起发送回,然后在控制器中再次获取那些其他值) 【参考方案1】:

通常您会使用表单并将这些数据发回,而不是使用 ActionLink。但是,由于 ActionLink 基本上是一个 <a>,其 HREF 设置为操作方法 URL,因此您可以使用 javascript 附加它(例如,在 HTML 属性中,如果您提供 CmtLink 的 ID):

$("#CmtLink").on("click", function() 
    var href = $(this).attr("href");
    //I assume it doesn't exist, but it's good to check for an existing comment parameter
    //also assume at least one parameter present
    //Also assume comment control is textbox, not textarea
    href += "&comment=" + $("#comment").val();

    $("#CmtLink").attr("href", href);
);

点击时,它总是可以获取最近输入的值,或者如果 cmets 为空,则可以取消默认行为。

【讨论】:

这是一个非常有趣的技巧!让我试试吧!无论如何,你得到了我的支持! :)

以上是关于通过组合动作链接和 ASP.Net MVC 5 中的输入将用户键入的输入从视图传递到动作控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定视图中动作的上下文(asp.net mvc)

VS 2015 ASP.NET 4 MVC 5 中的打字稿 - 设置和选择的工作组合是啥?

ASP.NET MVC教程五:ASP.NET MVC中的路由

ASP.NET MVC 架构:ViewModel 通过组合、继承还是复制?

ASP.NET MVC 4 异步子动作

Asp.Net Mvc 突出显示当前页面链接技术?