Проблема с атрибутом MVC3 AllowHtml

У меня есть веб-приложение на основе MVC3 (нет бета-версии или релиза, версия RTM/RTW), в которой есть действие, которое принимает файлы XML для обработки.

Конечно, это кажется злым для MVC из-за возможных атак, поэтому он этого не позволяет. Ну, я пытаюсь поставить либо AllowHtml на объект модели как таковой:

   public class XMLModel
    {
        [AllowHtml]
        public string msg { get; set; }
    }

Или я устанавливаю ValidateInput на false в моем методе действий, например:

    [ValidateInput(false)]
    public ActionResult AddCDR(XMLModel model)
    {
    }

Причиной наличия "сильно" типизированной модели в первую очередь было то, что я изначально пытался иметь строковое значение с именем msg в качестве параметра метода действия, но это всегда возвращалось пустым.

Теперь, когда кто-то отправляется в эту форму, либо на том же компьютере, либо на сетевом компьютере, поле msg всегда пустое.

Я проверил с WireShark, что данные действительно находятся в запросе.

Теперь, одна интересная вещь. Это не обязательно для MVC 3. Тем не менее это имеет небольшое значение.

Если я добавлю это в свою веб-конфигурацию:

<httpRuntime requestValidationMode="2.0" />

Он работает для запросов, поступающих с локального компьютера, но НЕ работает из другой системы.

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

Я также узнал об ошибке в RC2 - это не должно меня сильно повлиять, но я попытался добавить в Application_Start() все равно:

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();

Как и ожидалось, это не имеет никакого значения.

Все работает так, как ожидалось, на моем компьютере разработки (Win7x64, VS2010), но в целевой системе (Win2008R2x64, IIS7.5) вышеупомянутые проблемы затрудняют время.

Очень важно отметить. Если я отправляю в действие без угловых скобок, я получаю данные формы, как ожидалось. Как только появятся угловые скобки, хотя мое действие вообще не вызывается или оно не находит данные формы, ни в параметрах метода действия, ни, например, в Request.Params [ "msg" ], где это должен быть.

Любые идеи, позволяющие XML через?

UPDATE

Я попытался обойти это, ожидая, когда кто-нибудь придумает ответ. Я еще не смог его решить, но я проверил несколько дополнительных деталей;

  • Во-первых, я подтвердил, что версия ASP.NET MVC 3, установленная как на моем компьютере разработки, так и на веб-сервере, одинакова; v3.0.20105.0 (в соответствии с "Установка и удаление программ" ).
  • Веб-приложение было создано с помощью бета-версии MVC3, а затем преобразовано в RC1 и RC2 по мере их выхода и, наконец, в версию RTM. Это означало, что мне пришлось изменить код из-за изменения ViewBag. Однако, поскольку я не знал точно, что еще изменилось, я создал совершенно новое приложение MVC3 с версией RTM, создал контроллер с тем же именем, с тем же методом действий, взяв модельный объект, аналогичный используемому в данный момент, переименовал старый каталог веб-приложений и поместил эту новую. Точно так же происходит - например, параметр с атрибутом AllowHtml проходит со всем содержимым, когда запрос выполняется с локального компьютера, но если он поступает с удаленной машины, то HTML (фактически XML) удаляется.
    • Не исключение. Я установил Elmah и проверил это - исключение не существует, мой метод действия, по-видимому, просто вызван с чем-либо похожим на XML, удаленным из параметров в метод.

Излишне говорить, что это сводит меня с ума. Вчера у меня был какой-то совет, чтобы посмотреть исходный код MVC3, но, к сожалению, это мне действительно не помогает, поскольку я не вижу ничего явно неправильного там, и я не могу отлаживать код на рассматриваемом сервере.

Любые идеи все еще очень нужны, спасибо!:)

Ответ 1

Я отвечаю на это сам, потому что это была неясная ситуация, и MVC3 не была проблемой.

Система, в которой POSTed данные в мое приложение делала это с искаженными данными. В дополнение к этому мне сказали, что они также были POST для более старого приложения MVC2, которое отлично работало - это было неправильно, оказалось, что в этом случае они были GETting, и GET они бы сделали правильно.

Если что-либо, достаточно тщательное тестирование подтвердило, что атрибут AllowHtml работает очень хорошо. Никогда не доверяйте своему входу, пожалуйста.:)

Ответ 2

Я не могу воспроизвести это.

Модель:

using System.Web.Mvc;

namespace MvcApplication3.Models {
    public class XmlModel {
        [AllowHtml]
        public string msg { get; set; }
    }
}

Контроллер:

using System.Web.Mvc;
using MvcApplication3.Models;

namespace MvcApplication3.Controllers {
    public class HomeController : Controller {
        public ActionResult Index() {
            return View();
        }

        [HttpPost]
        public ActionResult Index(XmlModel model) {
            return View();
        }
    }
}

Вид:

@model MvcApplication3.Models.XmlModel

@using (Html.BeginForm()) {
    <div class="editor-label">
        @Html.LabelFor(model => model.msg)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.msg)
        @Html.ValidationMessageFor(model => model.msg)
    </div>
}

Они были добавлены в пустой проект MVC 3 по умолчанию. Все хорошо. Когда я удаляю [AllowHtml], он генерирует соответствующее сообщение об ошибке.