2015-07-09 18 views
5

kullanarak kontrolöre int). BuradaGeçiş birden çok örnek (Her <code>theates</code> bir TheatresName (dize) var, TheatresNumber (int), HomeCinemaID (int), RowAmount AJAX</p> <p>kullanarak kontrolöre görünümden bir <code>List<Theatres></code> göndermeyi deneyin Ajax

modeli kodu:

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; } 

    } 

kullanıcı döngü bunları oluşturma seçeneğini verdi için o da ihtiyaç kaç tiyatro girin.

görünüm kodu:

@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 kodu:

<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() 
    } 
}); 

Kontrolör Kod

 // 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 zaman bana ne i bir null .. atmak için yap?

+2

Eğer kullanılmış denetleyici kodu ve örnek teşkil edebilir ?? –

+1

tamam ben –

+0

gönderdiği düzenlenmiş Nerede tam bir istisna atar? Görünümde veya kontrolörde mi? Denetleyicide bir JsonResult döndürme hakkında nasıl bir geri bildirim: Json (Data, JsonRequestBehavior.AllowGet); – Fabjan

cevap

1

Bana göre sen uygulayabileceğiniz en iyi şudur, bu kesinlikle sizin için çalışacaktır:

bu şekilde html değiştirme

: Öncelikle bu model için yukarıdaki modelini değiştirmek

@model List<CimenaCityProject.Models.MovieTheaters> 

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

Sonra senin form böyle olmalı, Yaptığım değişiklikler, tüm editörlerinize ve her alana farklı bir ad verecek olan tüm açılır kapanır listelerine de endekslidir.

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() 
} 
:

@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") 
     } 

Şimdi komut kodu Sadece jquery $('form:first').serializeArray(); bunu seri ederek bütün formu göndermek, böyle olmalı: i yazdım gibi açılan onların "Sizin Listesi" listenizi bağlamak unutmayın

Tümü tamamlandı, Kontrol ünitesi şimdi değerlerinizi alacak :)

+0

derleyici bana bu hatayı gönder: Hata 'MovieTheaters' türü veya ad alanı adı bulunamadı (kullanma yönergesi veya derleme başvurusu eksik misiniz?) \t c: \ Windows \ Microsoft.NET \ Framework \ v4. 0.30319 \ Geçici ASP.NET Dosyaları \ temp \ 6a3fbc73 \ 2c7719c0 \ App_Web_54j5atfj.4.cs CimenaCityProject –

+0

Şimdi düzenlenmiş, Model listenizi Güncelle . Nedeni tam ad alanı gerekiyordu –

+0

mmm bu hatada dropDownList .look ile ilgili bir sorun var: Hata 'System.Web.Mvc.HtmlHelper >' 'DropDownListFor' ve en iyi uzatma yöntemi aşırı yüklemesi 'System.Web.Mvc.Html.SelectExtensions.DropDownListFor (System.Web.Mvc.HtmlHelper , System.Linq.Expressions.Expression <) için bir tanım içermiyor System.Func >, System.Collections.Generic.IEnumerable ) 'bazı geçersiz bağımsız değişkenleri var –

2

Tamam. Çok teşekkürler @Rohit Arora ve @Hemant Bhagat burada tam cevap çalışan çok iyi.

Kod Denetleyici:

 // 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(); 
    } 

Görünüm Kodu:

@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 Kodu:

<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

Yardım için sevindim :) –

+0

Herhangi bir zaman kardeşim :) –