根据asp.net mvc中的模型值,将帖子发布到多个操作方法

时间:2017-12-13 03:44:36

标签: asp.net-mvc

在Asp.net MVC中,单击同一个按钮时,是否可以根据模型值对两个不同的动作进行表单发布?

实施例。 - 我想点击相同的按钮添加新客户或更新现有客户"保存"。可以根据客户的id值将表单发布到两种不同的操作方法。

如果客户ID值= 0,则将其发布到"创建" acction方法,如果客户id值已经存在(不等于0),则将表单发布到"更新"行动方法?

这是否可以在asp.net mvc中使用?

3 个答案:

答案 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">
}