三个按钮从控制器调用相同的操作方法 - 确定调用哪一个方法

Posted

技术标签:

【中文标题】三个按钮从控制器调用相同的操作方法 - 确定调用哪一个方法【英文标题】:Three buttons are caling same Action Method from a Controller - determine which one invoked method 【发布时间】:2017-06-19 20:19:47 【问题描述】:

我正在开发小型 MVC 应用程序,并且在我的视图中, 有3个按钮,它们都在调用相同的Action,这里是按钮的定义:

<button type="submit" class="btn btn-success pull-right" id="btnSave" value="tabOne"><i class="fa fa-save"></i> Submit changes </button>

其中三个是这样的,我怎么知道哪个调用了一个方法,因为它们位于三个单独的 TABS 上,并且提交时的每个选项卡(保存更改)都需要重定向到不同的视图,所以这就是原因为什么我需要识别哪个按钮调用了我的 [HttpPost] Edit 操作方法..

这是我正在调用的方法的外观:

[HttpPost]
public ActionResult Edit(ArticleEditViewModel model)

  if (ModelState.IsValid)
  
//Rest of some code
//Here I need to determine which button called this method so I can redirect user //to a corresponding view, for example 
    if(button1 invoked me)
    
       return RedirectToAction("Edit", "Article");
    
    else if(button 2 invoked me)
    
       return RedirectToAction("Index", "Article");
    

各位,差不多就这些了,我有选项卡控件、3 个提交相同 Action 方法的按钮,我需要弄清楚是哪个按钮调用了某个方法。

谢谢大家 干杯

【问题讨论】:

【参考方案1】:

为具有不同值的按钮赋予name 属性

<button type="submit" name="clickedFrom" id="btnSave" value="tabOne" >Tab one</button>
<button type="submit" name="clickedFrom" id="btnSave2" value="tabTwo" >Tab Two</button>

并为您的 http post 操作方法添加一个具有相同名称的参数

[HttpPost]
public ActionResult Edit(ArticleEditViewModel model,string clickedFrom)

   // to do : Check value of clickedFrom and do something
   // to do : return something

当表单提交时,浏览器会在请求体中的clickedFrom键中发送被点击按钮的值

【讨论】:

我是否应该将此字符串 clickedFrom 作为可空参数,以防有一天我需要从另一个视图调用它并且我不会将任何内容传递给我的 Edit 操作方法,或者可以离开就像我可能会检查 if(clickedFrom!=null) //Do something ? 并且有些类型不是,所以如果您调用示例 Edit 方法并且您没有为 clickedFrom 提供值,情况可能会很危险? :D 不确定您所说的情况可能很危险。但简而言之,您将检查 clickedFrom 变量的值并根据该值采取行动。如果您没有为名称为“clickedFrom”的输入元素提供值,它将为空。所以你的代码应该处理它(如果不是 null ,请执行此操作,否则执行此操作(您的条件重定向)) 投票支持这么好的帮助! :) 非常感谢我的朋友,在这里我收到了一些其他问题,所以你可以看看:***.com/questions/44636246/…【参考方案2】:

在您的事件处理程序中,您会收到一个event 作为参数,以获取与所发生事件相关的特定信息。您要查找的具体属性是Event.target。

// Taken from Event.target MDN, this will hide the caller of the event
$("#btnSave").click(function(event) 
    event.target.style.visibility = 'hidden';
);

为了简洁,我使用jQuery绑定事件,在这个例子中它和vanilla JS之间的区别是疏忽的

【讨论】:

【参考方案3】:

除非你通过javascript传递参数,否则我认为这是不可能的。

为什么不直接传递值属性“tabOne”、“tabTwo”或“tabThree”?

【讨论】:

以上是关于三个按钮从控制器调用相同的操作方法 - 确定调用哪一个方法的主要内容,如果未能解决你的问题,请参考以下文章

从按钮操作中调用变量并在出现错误时显示错误消息

从邮件中打开自定义文件后调用哪种方法

调用相同的视图控制器但需要不同的操作

从模态视图控制器调用方法

DATAGridViewCell 自定义视图按钮操作方法没有被调用?

在 IBAction 方法中调用的完成处理程序