ASP.NET MVC 2 загрузка частичного представления с помощью jQuery - отсутствие проверки на стороне клиента

Я использую jQuery.load() для частичного просмотра. Эта часть выглядит следующим образом:

$('#sizeAddHolder').load(
                '/MyController/MyAction', function () { ... });

Код для действий в моем контроллере следующий:

    public ActionResult MyAction(byte id)
    {
        var model = new MyModel
        {
            ObjectProp1 = "Some text"
        };

        return View(model);
    }

    [HttpPost]
    public ActionResult MyAction(byte id, FormCollection form)
    {
        // TODO: DB insert logic goes here

        var result = ...;

        return Json(result);
    }

Я возвращаю частичное представление, которое выглядит примерно так:

<% using (Html.BeginForm("MyAction", "MyController")) {%>
    <%= Html.ValidationSummary(true) %>

    <h3>Create my object</h3>

    <fieldset>
        <legend>Fields</legend>

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

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

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

<% } %>

В этом случае проверка на стороне клиента не работает. Более того, script, который содержит сообщения проверки, также не включен в возвращаемое представление. Оба свойства в моем классе модели имеют атрибуты Required и StringLength. Есть ли способ инициировать проверку на стороне клиента в представлении, которое было загружено следующим образом?

Ответ 2

Прежде всего, вы должны вернуть частичный вид, а не представление.

return PartialView(model);

Во-вторых, пытаетесь ли вы загрузить этот частичный вид с помощью AJAX? В этом случае вы можете использовать jquery.ajax

function ajax_update(path)
  $.ajax {
    url: path,
    success: function(result) {
      $('#sizeAddHolder').html(result);
    }
  return false;
}

Ответ 3

Вы должны использовать dataType при вызове ajax

function ajax_update(path)
  $.ajax {
    url: path,
    dataType: "html",
    success: function(result) {
      $('#sizeAddHolder').html(result);
    }
  return false;
}

Из jQuery docs:

DATATYPE По умолчанию: Intelligent Guess (xml, json, script или html)

Тип данных, которые вы ожидаете от сервера. Если ни один не указан, jQuery будет разумно пытаться получить результаты на основе MIME-типа ответа (XML MIME-тип даст XML, в 1.4 JSON будет создан объект JavaScript, в 1.4 script будет выполняться script, и все остальное будет возвращено в виде строки). Доступные типы (и результат, переданный в качестве первого аргумента в ваш обратный вызов успеха):

* "xml": Returns a XML document that can be processed via jQuery.
* "html": Returns HTML as plain text; included script tags are evaluated when inserted in the DOM.
* "script": Evaluates the response as JavaScript and returns it as plain text. Disables caching unless option "cache" is used. Note: This will turn POSTs into GETs for remote-domain requests.
* "json": Evaluates the response as JSON and returns a JavaScript object. In jQuery 1.4 the JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. (See json.org for more information on proper JSON formatting.)
* "jsonp": Loads in a JSON block using JSONP. Will add an extra "?callback=?" to the end of your URL to specify the callback.
* "text": A plain text string.

Ответ 4

Я не уверен, что вы все еще пытаетесь ответить на свой вопрос, но я написал сообщение о том, что загруженные формы AJAX работают с проверкой на стороне клиента в ASP.NET MVC 2: http://tpeczek.com/2010/04/making-aspnet-mvc-2-client-side.html

Ответ 5

Проблема в том, что форма, загруженная с помощью ajax, никогда не регистрируется при проверке Microsoft. Чтобы решить эту проблему, вызовите следующую функцию Sys.Mvc.FormContext._Application_Load.

function ajax_update(path)
  $.ajax {
    url: path,
    success: function(result) {
      $('#sizeAddHolder').html(result);
      Sys.Mvc.FormContext._Application_Load();
    }
  return false;
}

Это должно исправить это. Кроме того, убедитесь, что формы, которые вы загружаете с помощью ajax, имеют уникальный идентификатор. В противном случае проверка не будет выполнена.

Избегайте использования load(). Он удаляет все сценарии, загруженные в ответ.

Ответ 6

В html файле вы можете иметь что-то вроде:

Извините, но я не знаю, как отправить ссылку html. Таким образом, вы можете иметь ссылку class= "delete", id= value и href= "javascript:;"

Затем я использовал эту функцию для частичного просмотра:

 $(".delete").click(function(event){
          var id = $(".select").attr("id");
          var id2 = event.target.id;
          $.ajax({
                url: "Persona/Delete?idPersona=" + id2.toString(),
                success: function (data) {
                    $("#popUpConfirmar").html(data);
                }
            });

            dialogoPopUp.dialog("open");
        });

Помните, что в контроллере должно быть такое действие:

    public PartialViewResult Delete(int idPersona)
    {
        PersonaDataAccess personaDataAccess = new PersonaDataAccess();
        Persona persona = personaDataAccess.GetOne(idPersona);
        return PartialView("Delete",persona);
    }