【问题标题】:Form post to multiple action methods based on model value in asp.net mvc基于asp.net mvc中的模型值形成post到多个action方法
【发布时间】:2017-12-13 03:44:36
【问题描述】:

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

例如。 - 我想通过单击“保存”按钮来添加新客户或更新现有客户。表单是否可以根据客户的 id 值发布到两种不同的操作方法。

如果客户 ID 值 = 0,则将其发布到“创建”操作方法,如果客户 ID 值已经存在(不等于 0),则将表单发布到“更新”操作方法?

这在asp.net mvc中可以吗?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    不,您不能以公平的方式在提交时调用多个操作,

    你需要为id添加隐藏字段

    <input type="hidden" name="id" value="@model.Id" />
    

    当您提交表单时,将从模型中检索值

    并检查隐藏字段值是否为0

    如果 0 比实体需要创建,否则它用于更新

    public ActionResult Save(Customer customer){
        if(customer.id > 0){
            // Update Entity
        }
        else{
            // Create Entity
        }
    }
    

    【讨论】:

      【解决方案2】:

      是的。有可能的。有多种方法可以做到这一点。

      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 属性值,执行更新或创建的代码根据需要。

      【讨论】:

        【解决方案3】:

        是的。这适用于 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">
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-24
          • 2018-05-19
          • 2021-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多