是的。有可能的。有多种方法可以做到这一点。
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 添加到您的提交按钮,该属性的值可以是根据您的 Id 属性创建或更新操作方法的 url价值。
@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>
}
当您在提交按钮上指定formaction 属性时,它将覆盖父表单的操作属性值。
3) 另一种选择是在javascript中劫持表单submit事件,阻止默认行为(停止表单提交),然后将表单的action属性值更新为/create或/update 并使用javascript 触发表单submit。您可以将Id 属性值保存在表单内的隐藏字段中,并读取该值并使用它来确定表单操作属性值的 url。
假设您的页面中有 int 类型的 Id 属性的隐藏元素
@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)
}
而 javascript 劫持表单提交并更新表单的 action 属性值就像
$(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();
});
});
4) 另一种选择是始终将表单提交到Update 或Create 操作,并在该方法内,根据Id 属性值,执行更新或创建的代码根据需要。