2015-07-20 1 views
0

У меня проблемы с проверкой частичного представления. Мой указатель просматривается несколькими частичными представлениями. Один из этих просмотров, _Contact, используется для того, чтобы пользователи могли подчиняться предстоящему событию. Я хочу включить проверку, если кто-то уже отправил событие с введенным электронным письмом. Все работает отлично, но проблема в том, что он не показывает сообщение о неудачной подаче (он не выполняет проверку на стороне сервера, но не показывает ошибку пользователю). Вот мой код:Ошибка частичного просмотра ASP.NET

Index: 
... 
@if(ViewBag.Competitor==null) 
{@Html.Partial("_Contact", new CompetitorViewModel())}else 
          { 
@Html.Partial("_Contact",(CompetitorViewModel)ViewBag.Competitor) 
} 
... 

_Contact: 
@model Models.CompetitorViewModel 

<script src="@Url.Content("~/Scripts/jquery.js")"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")">  </script> 


<section id="contact"> 
    <div id="contact-us" class="parallax"> 
     <div class="container"> 
      <div class="row"> 
       <div class="heading text-center col-sm-8 col-sm-offset-2 wow fadeInUp" data-wow-duration="1000ms" data-wow-delay="300ms"> 


       </div> 
      </div> 
      <div class="contact-form wow fadeIn" data-wow-duration="1000ms" data-wow-delay="600ms"> 
       <div class="row"> 
        <div class="col-sm-6"> 
         @using (Html.BeginForm("SubmitStudent", "Home", FormMethod.Post, new { id = "main-contact-form" })) 
         { 
          @Html.ValidationSummary(true) 
          <div class="row wow fadeInUp" data-wow-duration="1000ms" data-wow-delay="300ms"> 
           <div class="col-sm-6"> 
            <div class="form-group"> 
             @Html.TextBoxFor(model=>model.firstName, new { @class = "form-control", @placeholder="Ime"}) 
             @Html.ValidationMessageFor(model=>model.firstName) 
            </div> 
           </div> 
           <div class="col-sm-6"> 
            <div class="form-group"> 
             @Html.TextBoxFor(model=>model.lastName, new { @class = "form-control", @placeholder="Prezime"}) 
             @Html.ValidationMessageFor(model=>model.lastName) 
            </div> 
           </div> 
          </div> 
          <div class="form-group"> 
           @Html.TextBoxFor(model=>model.eMail, new { @class = "form-control", @placeholder="Email Adresa"}) 
           @Html.ValidationMessageFor(model=>model.eMail) 
          </div> 
          <div class="form-group"> 
           @Html.DropDownListFor(m=> m.collegeId, (IEnumerable<SelectListItem>)ViewBag.Colleges) 
          </div> 


          <div class="form-group"> 

           <input type="submit" value="Prijavi me" class="btn-submit" /> 
          </div> 

         } 
        </div> 
        <div class="col-sm-6"> 
         <div class="contact-info wow fadeInUp" data-wow-duration="1000ms" data-wow-delay="300ms"> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
</section><!--/#contact--> 

main.js:

var form = $('#main-contact-form'); 
form.submit(function(event){ 
    event.preventDefault(); 
    var form_status = $('<div class="form_status"></div>'); 
    $.ajax({ 
     type:"POST", 
     url: '/Home/SubmitStudent', 
     data: $('#main-contact-form').serializeArray(), 
    cache: false, 
     beforeSend: function(){ 
      form.prepend(form_status.html('<p><i class="fa fa-spinner fa-spin"></i> Your request is being sent...</p>').fadeIn()); 
     } 
}). 
    success(function(data){ 


     form_status.html('<p class="text-success">Thank you for submitting to this event</p>').delay(3000).fadeOut(); 
    }). 
     complete(function() 
    { 
      $("#main-contact-form").each(function() { $.data($(this)[0], 'validator', false); }); 
      $.validator.unobtrusive.parse("#main-contact-form"); 
    }) 

}); 

HomeController:

[HttpPost] 
    public ActionResult SubmitStudent(CompetitorViewModel c) 
    { 
     var colleges = _db.colleges.Distinct().ToList(); 
     ViewBag.Colleges = new SelectList(colleges, "id", "Name"); 

      if (!ModelState.IsValid) 
     { 
      ViewBag.Competitor = c; 

     } 
     else 
     { 
      var competitors = _db.competitors; 


      foreach (Competitor c1 in competitors) 
      { 
       if (c1.eMail == c.eMail) 
        { 
         ModelState.AddModelError("c.eMail", "That E-mail is already registered to this event."); 
         ViewBag.Competitor = c; 
         return View("Index"); 
        } 
      } 


      DCCollege college = (DCCollege)_db.colleges.Find(c.collegeId); 
      Competitor competitor = new Competitor(); 
      competitor.firstName = c.firstName; 
      competitor.lastName = c.lastName; 
      competitor.eMail = c.eMail; 
      competitor.college = college; 

      competitors.Add(competitor); 
      _db.Save(); 
     } 

     return View("Index"); 
    } 

Я был бы очень признателен, если кто-то может мне помочь. Я борюсь с этим довольно долгое время.

ответ

0

Я быстро просмотрел код. Я думаю, вы не видите сообщение проверки, потому что добавляете его в ModelState, но затем вы не передаете модель в представление.

+0

Я передаю модель для просмотра. Я положил его в ViewBag и в Index view я передал его частичному _Contact в качестве модели. Я также попытался вернуть частичный вид непосредственно с контроллера, тоже не работал. – alminh

+0

Да, но ModelState не связан с ViewBag.You переходит к «Index» ModelState, но «Контакты» получает только модель от ViewBag. Извините, я не знаю, как передать ModelsState в PartialView, возможно, это возможно, но я так не думаю. Самое простое решение для вас - добавьте сообщение об ошибке в ViewBag и покажите его вручную (

@ ViewBag.ErrorMessage

). Но это действительно плохо. Я предлагаю вам подумать об изменении логики, архитектуры. Например, вы можете проверить электронную почту, используя другой небольшой запрос на сервер, HTTP GET. – anastasiya