您可以通过三种方式解决上述问题
- HTML方式
- jQuery方式
- “ActionNameSelectorAttribute”方式
下面是一个视频,它以演示的方式总结了所有三种方法。
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
HTML方式:-
在 HTML 方式中,我们需要创建两个表单并在每个表单中放置“提交”按钮。并且每个表单的动作都将指向不同/各自的动作。您可以看到下面的代码,第一个表单发布到“Action1”,第二个表单将发布到“Action2”,具体取决于单击了哪个“提交”按钮。
<form action="Action1" method=post>
<input type=”submit” name=”Submit1”/>
</form>
<form action="Action2" method=post>
<input type=”submit” name=”Submit2”>
</form>
阿贾克斯方式:-
如果您是 Ajax 爱好者,那么第二个选项会让您更加兴奋。在 Ajax 方式中,我们可以创建两个不同的函数“Fun1”和“Fun1”,见下面的代码。这些函数将使用 JQUERY 或任何其他框架进行 Ajax 调用。这些函数中的每一个都与“提交”按钮的“OnClick”事件绑定。这些函数中的每一个都调用相应的操作名称。
<Script language="javascript">
function Fun1()
{
$.post(“/Action1”,null,CallBack1);
}
function Fun2()
{
$.post(“/Action2”,null,CallBack2);
}
</Script>
<form action="/Action1" method=post>
<input type=submit name=sub1 onclick=”Fun2()”/>
</form>
<form action="/Action2" method=post>
<input type=submit name=sub2 onclick=”Fun1()”/>
</form>
使用“ActionNameSelectorAttribute”:-
这是一个很棒而且很干净的选择。“ActionNameSelectorAttribute”是一个简单的属性类,我们可以在其中编写决策逻辑来决定可以执行哪些操作。
所以第一件事是在 HTML 中,我们需要将正确的名称放在提交按钮上,以便在服务器上识别它们。
您可以看到我们在按钮名称中添加了“保存”和“删除”。您还可以注意到在操作中我们刚刚输入了控制器名称“客户”而不是特定的操作名称。我们期望动作名称将由“ActionNameSelectorAttribute”决定。
<form action=”Customer” method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>
因此,当单击提交按钮时,它首先会点击“ActionNameSelector”属性,然后根据触发的提交,它会调用适当的操作。
所以第一步是创建一个继承自“ActionNameSelectorAttribute”类的类。在这个类中,我们创建了一个简单的属性“Name”。
我们还需要重写返回 true 或 flase 的“IsValidName”函数。这个函数是我们编写一个动作是否必须执行的逻辑的地方。因此,如果此函数返回 true,则执行该操作,否则不执行。
public class SubmitButtonSelector : ActionNameSelectorAttribute
{
public string Name { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo)
{
// Try to find out if the name exists in the data sent from form
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
}
}
上述函数的主要核心在下面的代码中。“ValueProvider”集合包含表单中发布的所有数据。因此它首先查找“Name”值,如果在 HTTP 请求中找到它,则返回 true,否则返回 false。
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
然后可以在相应的操作上装饰此属性类,并可以提供相应的“名称”值。因此,如果提交正在点击此操作并且如果名称与 HTML 提交按钮名称匹配,则它会进一步执行该操作,否则它不会执行。
public class CustomerController : Controller
{
[SubmitButtonSelector(Name="Save")]
public ActionResult Save()
{
return Content("Save Called");
}
[SubmitButtonSelector(Name = "Delete")]
public ActionResult Delete()
{
return Content("Delete Called");
}
}