2010-08-18 1 views
1

У меня есть вид с простым модным окном. Вы нажимаете на гиперссылку, она всплывает в окне, и если вы попытаетесь отправить заполненную форму без заполнения какой-либо информации, она отобразит соответствующее сообщение об ошибке проверки рядом с текстовым полем. Если вы закрываете модальное всплывающее окно и снова нажимаете гиперссылку, кажется, что проверка на стороне клиента не выполняется, когда вы нажимаете кнопку submit. Он просто позволяет его отправлять, а затем он будет проверять его на стороне сервера. Почему нужно открыть модальное всплывающее окно, а затем закрыть его, а затем снова открыть второй раз, чтобы проверка работоспособности перестала работать? Я использую базовый osx modal, который показан на SimpleModal Demos. Любые предложения будут ценны. Я проверил вокруг сайта, но если у кого-то есть предыдущий пост, который может быть полезен, это тоже будет оценено.MVC: проверка клиентов перестает работать в всплывающем окне SimpleModal AJAX после открытия и закрытия его один раз

Вот мой частичный вид файла:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<NSS.Models.Company>" %> 
<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script> 
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script> 
<script src="/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script> 
<fieldset> 
    <legend>New Company</legend> 

    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.Company_Name)%> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextBoxFor(model => model.Company_Name)%> 
     <%: Html.ValidationMessageFor(model => model.Company_Name)%> 
    </div> 

    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.Company_Phone)%> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextBoxFor(model => model.Company_Phone)%> 
     <%: Html.ValidationMessageFor(model => model.Company_Phone)%> 
    </div> 

    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.Company_Fax)%> 
    </div> 
    <div class="editor-field"> 
     <%: Html.TextBoxFor(model => model.Company_Fax)%> 
     <%: Html.ValidationMessageFor(model => model.Company_Fax)%> 
    </div> 

    <div class="editor-label"> 
     <%: Html.LabelFor(model => model.Company_Website)%> 
    </div> 

    <div class="editor-field"> 
     <%: Html.TextBoxFor(model => model.Company_Website)%> 
     <%: Html.ValidationMessageFor(model => model.Company_Website)%> 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 

Это частичное визуализируется в этом блоке .aspx:

<div id='container'> 
    <div id='content'> 
     <div id='osx-modal'> 
      <input type='button' name='osx' value='Demo' class='osx demo'/> 
     </div> 

     <!-- modal content --> 
     <div id="osx-modal-content"> 
      <div id="osx-modal-title">Create a new Company</div> 
      <div class="close"><a href="#" class="simplemodal-close">x</a></div> 
      <div id="osx-modal-data"> 
       <h2>Create a new Company</h2> 
       <% Html.RenderPartial("CreateForm", new NSS.Models.Company()); %> 
       <p><button class="simplemodal-close">Close</button> <span>(or press ESC or click the overlay)</span></p> 
      </div> 
     </div> 
    </div> 
</div> 

Вот мой код проверки :

public class Company_Validation 
{ 
    [Required(AllowEmptyStrings=false, ErrorMessage = "Company Name is required")] 
    [StringLength(50, ErrorMessage = "Company Name may not be longer then 50 characters")] 
    public string Company_Name { get; set; } 
} 

ответ

2

Из-за того, что SimpleModal обрабатывает содержимое модального файла, похоже, что он теряет привязку валидации.

Одним из вариантов было бы использовать параметр persist: true, но вы, вероятно, захотите удалить все заполненные значения формы.

Например:

$(element).modal({ 
    persist: true, 
    onClose: function (dialog) { 
     var modal = this; 
     $('input, textarea', dialog.data[0]).val(''); 
     modal.close(); 
    } 
}); 
+1

Это было именно это. Я начал играть, наблюдая за тем, как Visual Studio отображает открытые «Документы сценария», и мои сценарии вызова для MicrosoftAjax.js и MicrosoftMvcValidation.js появятся при первом открытии модального кода, но после его закрытия и открытия его во второй раз два файла сценария перестанут появляться. Так что потеря привязки имеет смысл. Если привязка происходит только при загрузке страницы, а не при открытии модальности, мне нужно будет повторно проверять валидацию на модальный каждый раз, когда она будет открыта, чтобы заставить ее использовать проверку (если я не использовал параметр persist)? – mattnss

+0

Если вы не использовали live() или delegate(), вам придется выполнять переустановку каждый раз (без опции persist). Это то, на что обратный вызов onShow, вы можете поместить туда свой код привязки, и он всегда вызывается. –

+1

Спасибо Эрик, я просто понял, что получил помощь от создателя SimpleModal, хорошо. – mattnss