您可以通过三种方式解决上述问题
- 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中,我们需要在提交按钮上加上适当的名称,以便在服务器上识别它们。
您可以看到我们在按钮名称上添加了“保存”和“删除”。您还可以注意到,在操作中,我们只是放置了控制器名称“ Customer”,而不是特定的操作名称。我们希望动作名称由“ 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”。
我们还需要覆盖“ IsValidName”函数,该函数返回true或flase。该函数是我们编写是否必须执行动作的逻辑的地方。因此,如果此函数返回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”集合具有从表单发布的所有数据。因此,它首先查找“名称”值,如果它在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");
}
}