MVC 4 Edit modal form using Bootstrap

前端 未结 4 1662
暖寄归人
暖寄归人 2020-11-29 16:41

I\'m using MVC 4 and Entity Framework to develop an intranet web application. I have a list of persons which can be modify by an edit action. I wanted to make my app more dy

4条回答
  •  南笙
    南笙 (楼主)
    2020-11-29 16:56

    In reply to Dimitrys answer but using Ajax.BeginForm the following works at least with MVC >5 (4 not tested).

    1. write a model as shown in the other answers,

    2. In the "parent view" you will probably use a table to show the data. Model should be an ienumerable. I assume, the model has an id-property. Howeverm below the template, a placeholder for the modal and corresponding javascript

      
      @foreach (var item in Model)
      {
          
      }
      
      @Html.Partial("dataRowView", item)

    note the "editor-success-id" in data table rows.

    1. The dataRowView is a partial containing the presentation of an model's item.

      @model ModelView
      @{
          var item = Model;
      }
      
      // some data
    2. Write the partial view that is called by clicking on row's button (via JS $('.editor-container').click(function () ... ).

      @model Model
      
      @using (Ajax.BeginForm("MyEditAction", "Controller", FormMethod.Post,
                          new AjaxOptions
                          {
                              InsertionMode = InsertionMode.Replace,
                              HttpMethod = "POST",
                              UpdateTargetId = "editor-success-" + @Model.Id,
                              OnSuccess = "success",
                              OnFailure = "failure",
                          }))
      {
          @Html.ValidationSummary()
          @Html.AntiForgeryToken()
          @Html.HiddenFor(model => model.Id)
          
          
      }
      

    This is where magic happens: in AjaxOptions, UpdateTargetId will replace the data row after editing, onfailure and onsuccess will control the modal.

    This is, the modal will only close when editing was successful and there have been no errors, otherwise the modal will be displayed after the ajax-posting to display error messages, e.g. the validation summary.

    But how to get ajaxform to know if there is an error? This is the controller part, just change response.statuscode as below in step 5:

    1. the corresponding controller action method for the partial edit modal

      [HttpGet]
      public async Task EditPartData(Guid? id)
      {
          // Find the data row and return the edit form
          Model input = await db.Models.FindAsync(id);
          return PartialView("EditModel", input);
      }
      
      [HttpPost, ValidateAntiForgeryToken]
      public async Task MyEditAction([Bind(Include =
         "Id,Fields,...")] ModelView input)
      {
          if (TryValidateModel(input))
          {  
              // save changes, return new data row  
              // status code is something in 200-range
              db.Entry(input).State = EntityState.Modified;
              await db.SaveChangesAsync();
              return PartialView("dataRowView", (ModelView)input);
          }
      
          // set the "error status code" that will redisplay the modal
          Response.StatusCode = 400;
          // and return the edit form, that will be displayed as a 
          // modal again - including the modelstate errors!
          return PartialView("EditModel", (Model)input);
      }
      

    This way, if an error occurs while editing Model data in a modal window, the error will be displayed in the modal with validationsummary methods of MVC; but if changes were committed successfully, the modified data table will be displayed and the modal window disappears.

    Note: you get ajaxoptions working, you need to tell your bundles configuration to bind jquery.unobtrusive-ajax.js (may be installed by NuGet):

            bundles.Add(new ScriptBundle("~/bundles/jqueryajax").Include(
                        "~/Scripts/jquery.unobtrusive-ajax.js"));
    

提交回复
热议问题