Вот альтернативный ответ, который использует чистые классы MVC, и вам не нужно жестко кодировать какой-либо скрипт или использовать jQuery.Во-первых, я обнаружил, что валидаторы MVC 2 работают нормально, успешно, неудачно и подтверждают случаи, если вы помните:
1) Включите необходимые скрипты MVC (всего три плюс вызов EnableClientSideValidation - см. MSDN).
2) Поместите MetadataClassAttribute и RequiredAttribtues в ваши объекты модели / данных.Вам не нужно создавать отдельные классы метаданных и делать вашу модель частичной (я считаю, что брюки) просто ссылаются на тот же класс модели в атрибуте.
3) Решите проблему перенаправления AJAX, возвращая JavaScript, как уже предлагалось(но в jQuery-ориентированном виде) ...
Я испытывал странное поведение только во время проверки, когда ему уже не удавалось перенаправить страницу списка на страницу сведений / редактирования.Сообщения об ошибках появляются на несколько секунд, а затем исчезают!Конечно, это было смущено, потому что оболочкой страницы была первая страница списка и внутреннее содержимое страницы редактирования.Таким образом, основной причиной проблемы был готовый инструментарий MVC 2, который не смог правильно перенаправить с первой страницы, а не то, что валидаторы не работали должным образом на второй странице.
Я нашел то же решениездесь:
http://craftycodeblog.com/2010/05/15/asp-net-mvc-ajax-redirect/ ... который я расширил до метода и класса расширения в VB.NET:
''' <summary>
''' MVC extension methods.
''' </summary>
Public Module MvcExtensions
''' <summary>
''' Returns an <see cref="AjaxAwareRedirectResult"/> for the specified action
''' and optional controller name.
''' </summary>
<Extension()> _
Public Function AjaxAwareRedirectToAction(controller As Controller, _
actionName As String, _
Optional controllerName As String = Nothing) _
As RedirectResult
' Get target URL
Dim url = controller.Url.Action(actionName, controllerName)
' Return AJAX aware redirect result
Return New AjaxAwareRedirectResult(url)
End Function
End Module
''' <summary>
''' <see cref="RedirectResult"/> which works with MVC 2 AJAX.
''' </summary>
''' <remarks>
''' Normal redirects do not work with AJAX partial updates in MVC (HTTP 302 status).
''' With MVC 2 AJAX it is necessary to return JavaScript to change the browser location.
''' </remarks>
Public Class AjaxAwareRedirectResult
Inherits RedirectResult
''' <summary>
''' Creates an instance which redirects to the specified URL using
''' a response containing either AJAX JavaScript or classic HTTPS 302 status.
''' </summary>
''' <param name="url">Target URL.</param>
Sub New(url As String)
MyBase.New(url)
End Sub
''' <summary>
''' Generates the response.
''' </summary>
Public Overrides Sub ExecuteResult(ByVal context As ControllerContext)
' Check if AJAX was used for request
If context.RequestContext.HttpContext.Request.IsAjaxRequest Then
' Perform JavaScript redirect when AJAX is used
Dim destinationUrl As String = UrlHelper.GenerateContentUrl(Url, context.HttpContext)
Dim result As JavaScriptResult = New JavaScriptResult With {
.Script = ("window.location='" + destinationUrl + "';")}
result.ExecuteResult(context)
Else
' Perform classic HTTP 302 status redirect
MyBase.ExecuteResult(context)
End If
End Sub
End Class
Итак, у вас есть два варианта.Вы можете следовать типичному шаблону MVC вызова AjaxAwareRedirectToAction (aciton, [controller]) для целей MVC или возвращать новый экземпляр AjaxAwareRedirectResult (url), когда вы имеете в виду конкретную цель URL (т.е. внешний сайт).
Я был очень удивлен, что Microsoft не отсортировала перенаправления AJAX в первом MVC 2 RTM.Я должен использовать MVC 2 в моем текущем проекте, поэтому я должен перенести это ограничение, но у меня также есть несколько более новых решений MVC, которые, как я вижу, больше склоняются к jQuery для проверки.Скоро узнаю, исправят ли они.