ASP.NET MVC 2 загружает частичное представление, используя jQuery - без проверки на стороне клиента - PullRequest
10 голосов
/ 16 апреля 2010

Я использую 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>

<% } %>

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

Ответы [ 6 ]

7 голосов
/ 16 апреля 2010

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

return PartialView(model);

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

function ajax_update(path)
  $.ajax {
    url: path,
    success: function(result) {
      $('#sizeAddHolder').html(result);
    }
  return false;
}
2 голосов
/ 17 апреля 2010

Вы должны использовать 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 скрипт выполнит скрипт и все иначе будет возвращено как строка). Доступные типы (и результат, переданный в качестве первого аргумента в ваш обратный вызов успеха):

* "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.
1 голос
/ 10 января 2011
1 голос
/ 27 сентября 2010

Проблема в том, что форма, загруженная с помощью 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 (). Удаляет все скрипты, загруженные в ответ.

1 голос
/ 05 мая 2010

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

0 голосов
/ 16 июня 2011

В 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...