2015-07-09 6 views
5

ich versuche, eine List<Theatres> aus dem Blickfeld Controller zu senden, indem Sie mit AJAXPass mehrere Instanz im Hinblick auf die Steuerung mit Ajax

jeder theates haben eine TheatresName (string), TheatresNumber (int), HomeCinemaID (int), RowAmount (int).

hier Modellcode:

public class MovieTheaters 
    { 
     [Key] 
     public int MovieTheatersID { get; set; } 

     public int HomeCinemaID { get; set; } 

     public string TheatersName { get; set; } 
     public int NumberHall { get; set; } 

     public int RowAmount { get; set; } 

     //FK . 
     public virtual HomeCinema HomeCinema { get; set; } 
     public virtual ICollection<Rows> Rows { get; set; } 

    } 

der Benutzer eingeben, wie viele Theater er dann brauchen für Schleife die Möglichkeit gab, sie zu schaffen.

Ansicht Code:

@model CimenaCityProject.Models.MovieTheaters 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create New Theatres</h2> 

@Html.AntiForgeryToken() 

@{ 
    int? maxNumberOfTheatres = ViewBag.number; 
    if (!maxNumberOfTheatres.HasValue) 
    { 
     maxNumberOfTheatres = 1; 
    } 
} 

@using (Html.BeginForm("Create", "Theatres", FormMethod.Post, new { name =  "TheatresForm", id = "TheatresForm" })) 
{ 
    @Html.ValidationSummary(true) 
    <table> 
     <tbody> 
      @for (int i = 0; i < maxNumberOfTheatres.Value; i++) 
      { 
      <tr> 
       <td id="NewTheaters"> 
        @ViewBag.ErrorMassage 
        <div style="position:relative; top: 0px; left: 205px; width: 278px;"> 
         @string.Format("Theares Number {0}", i + 1) 
        </div> 
        <div> 
         <br /> 
         <div class="form-group"> 
          @Html.LabelFor(model => model.HomeCinemaID, "HomeCinemaID", new { @class = "control-label col-md-2" }) 
          <div class="col-md-10"> 
           @Html.DropDownList("HomeCinemaID") 
           @Html.ValidationMessageFor(model => model.HomeCinemaID) 
          </div> 
          <br /> 
         </div> 

         <div class="form-group"> 
          @Html.LabelFor(model => model.TheatersName, new { @class = "control-label col-md-2" }) 
          <div class="col-md-10"> 
           @Html.EditorFor(model => model.TheatersName) 
           @Html.ValidationMessageFor(model => model.TheatersName) 
          </div> 
          <br /> 
         </div> 

         <div class="form-group"> 
          @Html.LabelFor(model => model.NumberHall, new { @class = "control-label col-md-2" }) 
          <div class="col-md-10"> 
           @Html.EditorFor(model => model.NumberHall) 
           @Html.ValidationMessageFor(model => model.NumberHall) 
          </div> 
          <br /> 
         </div> 

         <div class="form-group"> 
          @Html.LabelFor(model => model.RowAmount, new { @class = "control-label col-md-2" }) 
          <div class="col-md-10"> 
           @Html.EditorFor(model => model.RowAmount) 
           @Html.ValidationMessageFor(model => model.RowAmount) 
          </div> 
         </div> 
        </div> 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 
} 
<div class="form-group"> 
     <div class="col-lg-push-9"> 
     <input type="submit" name="Create" value="Create" id="Create" /> 
    </div> 
</div> 

<div id="divLoading" style="display: none; align-items: center"> 
    <img src="~/Image/Elements/ajax-loader.gif" /> 
</div> 

<div id="divResult"></div> 

    <div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    } 

Ajax-Code:

<script type="text/javascript"> 

    $(document).on('#TheatresForm' ,function() { 
     var NewTheaters = []; 
     $('table tbody tr td').each(function() { 
      NewTheaters.push({ 
       HomeCinemaID: $('#HomeCinemaID').val(), 
       TheatersName: $('#TheatersName').val(), 
       NumberHall: $('#NumberHall').val(), 
       RowAmount: $('#RowAmount').val() 
      }); 
     }); 

    $('#divLoading').show() 
    $.ajax({ 
     url: '@Url.Action()', 
     type: 'POST', 
     traditional : true, 
     data: JSON.stringify(NewTheaters), 
     contentType: 'application/json; charset=utf-8', 
     success: function (result) { 
      success(result) 
     }, 
     error: function (result) { 
      alert(result.responseText + "Error") 
      $('#divLoading').hide() 
     } 
    }); 
    function success(result) { 
     alert("success") 
     $('#divResult').html(result) 
     $('#divLoading').hide() 
    } 
}); 

-Controller-Code

 // GET: /Theatres/Create 
      public ActionResult Create(int? id, int? number) 
      { 
      if (id == null) 
      { 
       ViewBag.HomeCinemaID = new SelectList(db.HomeCinemas, "HomeCinemaID", "CinemaName"); 
       number = 1; 
       ViewBag.number = number; 
      } 
     else 
     { 
      ViewBag.HomeCinemaID = new SelectList(db.HomeCinemas.Where(x => x.HomeCinemaID == id).ToArray(), "HomeCinemaID", "CinemaName"); 
      ViewBag.number = number; 
     } 
     ViewBag.ErrorMassage = ""; 
     return View(); 
    } 

    // POST: /Theatres/Create 
    [HttpPost] 
    public ActionResult Create(List<MovieTheaters> NewTheaters) 
    { 
     foreach (var movietheaters in NewTheaters) 
     { 
      if (db.Theaters.Where(x => x.TheatersName == movietheaters.TheatersName && x.HomeCinemaID == movietheaters.HomeCinemaID).FirstOrDefault() == movietheaters) 
      { 
       ViewBag.ErrorMassage = "You cant add this Theatres again. Choose another name."; 
       ViewBag.HomeCinemaID = new SelectList(db.HomeCinemas.Where(x => x.HomeCinemaID == movietheaters.HomeCinemaID).ToArray(), "HomeCinemaID", "CinemaName", movietheaters.HomeCinemaID); 
       return View(movietheaters); 
      } 
      else 
      { 

       if (ModelState.IsValid) 
       { 
        db.Theaters.Add(movietheaters); 
        db.SaveChanges(); 
        return RedirectToAction("Create", "Rows", new { id = movietheaters.MovieTheatersID, rwcpcty = movietheaters.RowAmount, last = 1 }); 
       } 
      } 
      ViewBag.ErrorMassage = "Try again later"; 
      ViewBag.HomeCinemaID = new SelectList(db.HomeCinemas, "HomeCinemaID", "CinemaName", movietheaters.HomeCinemaID); 
      return View(movietheaters); 
     } 

     ViewBag.ErrorMassage = "Try again later"; 
     ViewBag.HomeCinemaID = new SelectList(db.HomeCinemas, "HomeCinemaID", "CinemaName"); 
     return View(); 
    } 

Evry Zeit es mir null werfen .. was ich habe zu machen?

+2

Können Sie den Controller-Code und Modell bieten Gebraucht ?? –

+1

ok ich habe den Beitrag bearbeitet –

+0

Wo genau wirft es eine Ausnahme? Im Blick oder im Controller? Wie wäre es mit der Rückgabe eines JsonResult in Controller-Controller wie: Return Json (Data, JsonRequestBehavior.AllowGet); – Fabjan

Antwort

1

ich Nach dem best Sie implementieren können, das ist, wird dies für Sie sicher arbeiten:

Ihre HTML Um dies zu ändern

: Erstens Ihr oben Modell zu diesem Modell Dann

@model List<CimenaCityProject.Models.MovieTheaters> 

@{ 
    var selectlist = (SelectList)ViewBag.HomeCinemaID; 
} 

ändern Sie Ihre form sollte so sein, Änderungen, die ich gemacht habe, sind die Indexierung, die auch allen deinen Editoren und der Dropdownliste gegeben wird, die dir einen anderen Namen zu jedem Feld gibt. Denken Sie daran, Ihre Liste zu Ihrem Drop-Down zu binden, wie ich ihre "Your List" geschrieben haben:

@using (Html.BeginForm("Create", "Theatres", FormMethod.Post, new { name =  "TheatresForm", id = "TheatresForm" })) 
    { 
     @Html.ValidationSummary(true) 
     <table> 
      <tbody> 
       @for (int i = 0; i < maxNumberOfTheatres.Value; i++) 
       { 
       <tr> 
        <td id="NewTheaters"> 
         @ViewBag.ErrorMassage 
         <div style="position:relative; top: 0px; left: 205px; width: 278px;"> 
          @string.Format("Theares Number {0}", i + 1) 
         </div> 
         <div> 
          <br /> 
          <div class="form-group"> 
           @Html.LabelFor(model => model[i].HomeCinemaID, "HomeCinemaID", new { @class = "control-label col-md-2" }) 
           <div class="col-md-10"> 
            @Html.DropDownListFor(model => model[i].HomeCinemaID,selectlist) 
            @Html.ValidationMessageFor(model => model[i].HomeCinemaID) 
           </div> 
           <br /> 
          </div> 

          <div class="form-group"> 
           @Html.LabelFor(model => model[i].TheatersName, new { @class = "control-label col-md-2" }) 
           <div class="col-md-10"> 
            @Html.EditorFor(model => model[i].TheatersName) 
            @Html.ValidationMessageFor(model => model[i].TheatersName) 
           </div> 
           <br /> 
          </div> 

          <div class="form-group"> 
           @Html.LabelFor(model => model[i].NumberHall, new { @class = "control-label col-md-2" }) 
           <div class="col-md-10"> 
            @Html.EditorFor(model => model[i].NumberHall) 
            @Html.ValidationMessageFor(model => model[i].NumberHall) 
           </div> 
           <br /> 
          </div> 

          <div class="form-group"> 
           @Html.LabelFor(model => model[i].RowAmount, new { @class = "control-label col-md-2" }) 
           <div class="col-md-10"> 
            @Html.EditorFor(model => model[i].RowAmount) 
            @Html.ValidationMessageFor(model => model[i].RowAmount) 
           </div> 
          </div> 
         </div> 
        </td> 
       </tr> 
      } 
     </tbody> 
    </table> 
    } 
    <div class="form-group"> 
      <div class="col-lg-push-9"> 
      <input type="button" name="Create" value="Create" id="Create" onclick="SaveTheatre()" /> 
     </div> 
    </div> 

    <div id="divLoading" style="display: none; align-items: center"> 
     <img src="~/Image/Elements/ajax-loader.gif" /> 
    </div> 

    <div id="divResult"></div> 

     <div> 
     @Html.ActionLink("Back to List", "Index") 
    </div> 

    @section Scripts { 
     @Scripts.Render("~/bundles/jqueryval") 
     } 

Jetzt Ihr Script-Code so sein sollte, nur senden Sie Ihre ganze Form, indem sie es in jquery Serialisierung $('form:first').serializeArray();:

function SaveTheatre() { 
    $.ajax({ 
     url: '@Url.Action("Create","Home")', 
     type: 'POST', 
     data: $('form:first').serializeArray(), 
     success: function(result) { 
      success(result) 
     }, 
     error: function(result) { 
      alert(result.responseText + "Error") $('#divLoading').hide() 
     } 
    }); 
} 

function success(result) { 
    alert("success") $('#divResult').html(result) $('#divLoading').hide() 
} 

Alles fertig, Sie werden jetzt Ihre Werte im Controller bekommen :)

+0

Compiler senden Sie mir, dass Fehler: Fehler Der Typ oder Namespace Name "MovieTheaters" konnte nicht gefunden werden (fehlen Sie eine Verwendungs-Richtlinie oder eine Assembly-Referenz?) \t c: \ Windows \ Microsoft.NET \ Framework \ v4. 0.30319 \ Temporäre ASP.NET-Dateien \ temp \ 6a3fbc73 \ 2c7719c0 \ App_Web_54j5atfj.4.cs CimenaCityProject –

+0

Jetzt bearbeitet, aktualisieren Sie Ihre Modelllinie zu @Model-Liste . Grund war, dass Sie vollen Namespace brauchen –

+0

mmm gibt es ein Problem mit der DropDownList .Look bei diesem Fehler: Fehler 'System.Web.Mvc.HtmlHelper > enthält keine Definition für 'DropDownListFor' und die beste Erweiterungsmethode 'System.Web.Mvc.Html.SelectExtensions.DropDownListFor (System.Web.Mvc.HtmlHelper , System.Linq.Expressions.Expression < System.Func >, System.Collections.Generic.IEnumerable ) 'hat einige ungültige Argumente –

2

ok. Vielen Dank @Rohit Arora und @Hemant Bhagat hier die volle Antwort funktioniert sehr gut.

-Code Controller:

 // GET: /Theatres/Create 
    public ActionResult Create(int? id, int? number) 
    { 
     if (id == null) 
     { 
      ViewBag.HomeCinemaID = new SelectList(db.HomeCinemas, "HomeCinemaID", "CinemaName"); 
      number = 1; 
      ViewBag.number = number; 
     } 
     else 
     { 
      ViewBag.HomeCinemaID = new SelectList(db.HomeCinemas.Where(x => x.HomeCinemaID == id).ToArray(), "HomeCinemaID", "CinemaName"); 
      ViewBag.number = number; 
     } 
     ViewBag.ErrorMassage = ""; 
     return View(); 
    } 

    // POST: /Theatres/Create 
    [HttpPost] 
    public ActionResult Create(List<MovieTheaters> NewTheaters) 
    { 
     foreach (var movietheaters in NewTheaters) 
     { 
      if (db.Theaters.Where(x => x.TheatersName == movietheaters.TheatersName && x.HomeCinemaID == movietheaters.HomeCinemaID).FirstOrDefault() == movietheaters) 
      { 
       ViewBag.ErrorMassage = "You cant add this Theatres again. Choose another name."; 
       ViewBag.HomeCinemaID = new SelectList(db.HomeCinemas.Where(x => x.HomeCinemaID == movietheaters.HomeCinemaID).ToArray(), "HomeCinemaID", "CinemaName", movietheaters.HomeCinemaID); 
       return View(movietheaters); 
      } 
      else 
      { 
       if (ModelState.IsValid) 
       { 
        db.Theaters.Add(movietheaters); 
        db.SaveChanges(); 
        return RedirectToAction("Create", "Rows", new { id = movietheaters.MovieTheatersID, rwcpcty = movietheaters.RowAmount, last = 1 }); 
       } 
      } 
      ViewBag.ErrorMassage = "Try again later"; 
      ViewBag.HomeCinemaID = new SelectList(db.HomeCinemas, "HomeCinemaID", "CinemaName", movietheaters.HomeCinemaID); 
      return View(movietheaters); 
     } 
     ViewBag.ErrorMassage = "Try again later"; 
     ViewBag.HomeCinemaID = new SelectList(db.HomeCinemas, "HomeCinemaID", "CinemaName"); 
     return View(); 
    } 

Code anzeigen:

@model List<CimenaCityProject.Models.MovieTheaters> 

@{ 
    ViewBag.Title = "Create"; 
    var selectlist = (SelectList)ViewBag.HomeCinemaID; 
} 

<h2>Create New Theatres</h2> 

@Html.AntiForgeryToken() 

@{ 
    int? maxNumberOfTheatres = ViewBag.number; 
    if (!maxNumberOfTheatres.HasValue) 
    { 
     maxNumberOfTheatres = 1; 
    } 
} 

@using (Html.BeginForm("Create", "Theatres", FormMethod.Post)) 
{ 
    @Html.ValidationSummary(true) 
    <table> 
     <tbody> 
      @for (int i = 0; i < maxNumberOfTheatres.Value; i++) 
     { 
      <tr> 
       <td id="NewTheaters" style="width:700px"> 
        @ViewBag.ErrorMassage 
        <div style="position:relative; top: 0px; left: 205px; width: 278px;"> 
         @string.Format("Theares Number {0}", i + 1) 
        </div> 
        <div> 
         <br /> 
         <div class="form-group"> 
          @Html.LabelFor(model => model[i].HomeCinemaID, "HomeCinemaID", new { @class = "control-label col-md-2" }) 
          <div class="col-md-10"> 
           @Html.DropDownListFor(model => model[i].HomeCinemaID, selectlist) 
           @Html.ValidationMessageFor(model => model[i].HomeCinemaID) 
          </div> 
          <br /> 
         </div> 

         <div class="form-group"> 
          @Html.LabelFor(model => model[i].TheatersName, new { @class = "control-label col-md-2" }) 
          <div class="col-md-10"> 
           @Html.EditorFor(model => model[i].TheatersName) 
           @Html.ValidationMessageFor(model => model[i].TheatersName) 
          </div> 
          <br /> 
         </div> 

         <div class="form-group"> 
          @Html.LabelFor(model => model[i].NumberHall, new { @class = "control-label col-md-2" }) 
          <div class="col-md-10"> 
           @Html.EditorFor(model => model[i].NumberHall) 
           @Html.ValidationMessageFor(model => model[i].NumberHall) 
          </div> 
          <br /> 
         </div> 

         <div class="form-group"> 
          @Html.LabelFor(model => model[i].RowAmount, new { @class = "control-label col-md-2" }) 
          <div class="col-md-10"> 
           @Html.EditorFor(model => model[i].RowAmount) 
           @Html.ValidationMessageFor(model => model[i].RowAmount) 
          </div> 
         </div> 
        </div> 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 
} 
<div class="form-group"> 
    <div class="col-lg-push-9"> 
     <input type="button" name="Create" value="Create" id="Create"  onclick="SaveTheatre()" /> 
    </div> 
</div> 

<div id="divLoading" style="display: none; align-items: center"> 
    <img src="~/Image/Elements/ajax-loader.gif" /> 
</div> 

<div id="divResult"></div> 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    } 

Ajax-Code:

<script src="~/Scripts/jquery-1.10.2.js"></script> 
<script src="~/Scripts/jquery-1.10.2.min.js"></script> 
<script src="~/Scripts/jquery.sigmacape.unobtrusive-1.1.2.js"></script> 

    <script type="text/javascript"> 
function SaveTheatre() { 
    $.ajax({ 
    url: '@Url.Action()', 
    type: 'POST', 
    traditional : true, 
    data: $('form:first').serializeArray(), 
// contentType: 'application/json; charset=utf-8', ---> this will give you Exeption Invalid JSON Primitive!! 
    success: function (result) { 
     success(result) 
    }, 
    error: function (result) { 
     alert(result.responseText + "Error") 
     $('#divLoading').hide() 
    } 
    }); 
} 

    function success(result) { 
    alert("success") 
    $('#divResult').html(result) 
    $('#divLoading').hide() 
    } 
    </script> 
+0

Froh zu helfen :) –

+0

Jederzeit bro :) –

Verwandte Themen