在Asp.net MVC中,单击同一个按钮时,是否可以根据模型值对两个不同的动作进行表单发布?
实施例。 - 我想点击相同的按钮添加新客户或更新现有客户"保存"。可以根据客户的id值将表单发布到两种不同的操作方法。
如果客户ID值= 0,则将其发布到"创建" acction方法,如果客户id值已经存在(不等于0),则将表单发布到"更新"行动方法?
这是否可以在asp.net mvc中使用?
答案 0 :(得分:1)
否你不能以公平的方式对提交采取多项行动,
您需要为id
添加hiddenfield<input type="hidden" name="id" value="@model.Id" />
提交表单时,将从模型中检索值
并检查隐藏字段值是否为0
如果0比实体需要创建其他,那么它是用于更新
public ActionResult Save(Customer customer){
if(customer.id > 0){
// Update Entity
}
else{
// Create Entity
}
}
答案 1 :(得分:0)
是。有可能的。有多种方法可以做到。
1)您可以根据视图模型属性值有条件地设置表单action
属性值。
<form method="post" action="@(Model.Id==0?Url.Action("Create","Home")
:Url.Action("Update","Home"))">
<input type="text" name="FirstName" />
<button type="submit">Save</button>
</form>
2)另一种选择是,您可以在提交按钮中添加html5 formaction
,该属性的值可以是根据您的{{创建或更新操作方法的网址1}}属性值。
Id
在提交按钮上指定@using (Html.BeginForm("Create", "Home"))
{
<input type="text" name="FirstName" />
<button type="submit"
formaction="@(Model.Id==0?Url.Action("Create","Home")
:Url.Action("Update","Home"))">Save</button>
}
属性时,它将覆盖父窗体的操作属性值。
3)另一种选择是在javascript中劫持表单formaction
事件,防止默认行为(停止表单提交),然后更新表单的submit
属性值到action
或/create
并使用javascript触发表单/update
。您可以将submit
属性值保存在表单内的隐藏字段中,并读取该值的值,并使用它来确定表单的操作属性值的URL应该是什么。
假设您的页面中Id
属性的ID具有隐藏元素
int
和劫持表单的javascript提交并更新表单的action属性值就像
@model YourViewModel
@using (Html.BeginForm("Create", "Home",FormMethod.Post,new {id="yourFormId"}))
{
@Html.TextBoxFor(a=>a.FirstName)
<button type="submit">Save</button>
@Html.HiddenFor(a=>a.Id)
}
4)另一个选项是始终将表单提交到$(function () {
$("#yourFormId").submit(function(e) {
e.preventDefault(); // stop the normal form submit
var id=parseInt($("#Id").val());
var url=$(this).attr("action");
if(id===0)
{
url='/Home/Update'; // Use the Url.Action to be safe to generate this
}
// read the data attribute and update the forms action and do a submit
$(this).closest("form").attr('action', url).submit();
});
});
或Update
操作,并在该方法内部根据Create
属性值执行根据需要更新或创建的代码。
答案 2 :(得分:0)
是。这适用于View案例:
@mode MyModel
@{
string action = Model.Id == 0 ? "Create" : "Edit"
}
@using (Html.BeginForm(action, "MyController"))
{
// if Edit need Id
if(action == "Edit")
{
@Html.HiddenFor(model=> model.Id)
}
@Html.TextBoxFor(model >= model.Name);
<input type="submit" value="Save">
}