Управление ASP.NET с помощью бритвенного движка MVC - PullRequest
5 голосов
/ 28 марта 2011

Я использую ASP.NET MVC 3 с механизмом шаблонов Razor для моего сайта.В настоящее время я разрешаю загрузку файлов следующим образом:

<form action="/File/Upload" method="post" enctype="multipart/form-data">
    <label for="file">Upload a file:</label>
    <input type="file" name="file" id="file" /> 
    <input type="submit" name="submit" value="Submit" />
</form>

Но я хотел бы использовать сторонний элемент управления, например NeatUpload , который позволяет отображать индикатор выполнения, выбор нескольких файлов и т. Д.

В документации они показывают используемый элемент управления следующим образом:

<%@ Register TagPrefix="Upload" Namespace="Brettle.Web.NeatUpload"
         Assembly="Brettle.Web.NeatUpload" %>
<Upload:InputFile id="inputFileId" runat="server" />

с некоторым кодом.

Механизму Razor, очевидно, не нравится этот синтаксис.Есть ли другой способ использовать сторонние элементы управления или мне не повезло?

Ответы [ 6 ]

4 голосов
/ 28 марта 2011

Сторонние элементы управления, которые работают с веб-формами, не совместимы с приложением pure MVC.Сказав это, вы можете работать с гибридным типом решения, используя веб-формы в некоторых местах и ​​MVC в других.Это не то, что я бы сделал лично, но вы могли бы.

См. этот пост Скотта Хансельмана, в котором подробно рассказывается об этом.

Использование элемента управления веб-форм на странице Razor просто не будет работать.

1 голос
/ 11 июня 2011

Специально для NeatUpload (что удивительно!) Теперь есть возможность получать загрузку очень больших файлов с использованием javascript на статической HTML-странице. Ясно, что это будет работать так же хорошо с MCV, какой бы движок представления вы не использовали:)

http://www.brettle.com/NeatUpload-1.3/dotnet/docs/Manual.html#3.11.Using%20NeatUpload%20from%20JavaScript%7Coutline

Итак, более общее решение "попросить разработчика пользовательского элемента управления обновить его до версии, совместимой с MCV"

Редактировать: я не буду изменять вышеприведенное, но учтите, что NeatUpload теперь размещен http://neatupload.codeplex.com/, но, возможно, мертв (почему бы не взять его, если у вас есть навыки и время разработчика!)

0 голосов
/ 27 апреля 2016

Вы можете сделать это, предполагая, что вы просто хотите визуализировать содержимое элемента управления и не заботитесь о регистрации сценариев или обратных передач и т. Д.

Создайте свой собственный HtmlTextWriter, запишите в него выходные данные, а затемвизуализировать эту строку в вашем Razor.В основном это идея @VeeTheSecond, сведенная к практике:

@{
    System.Web.UI.WebControls.Label label = new System.Web.UI.WebControls.Label()
    {
        Text = "Hello World!"
    };

    HtmlString renderedControl;

    using (StringWriter w = new StringWriter())
    {
        using (HtmlTextWriter htmlW = new HtmlTextWriter(w))
        {
            label.RenderControl(htmlW);

            renderedControl = new HtmlString(w.ToString());
        }
    }
}
<div>
    @renderedControl
</div>
0 голосов
/ 13 апреля 2013

Я только что обнаружил, что MVCRecaptcha проект, который, кажется, делает именно это. У меня не было времени, чтобы копаться во внутренних деталях, но суть содержится в двух небольших файлах. Для тех из вас, кому лень переходить по вышеуказанной ссылке, позвольте мне попытаться объяснить:

По сути, они создают элемент управления программно, а затем вызывают RenderControl для вывода HTML-кода на провод:

var captchaControl = new RecaptchaControl { ... }
var htmlWriter = new HtmlTextWriter(new StringWriter());
captchaControl.RenderControl(htmlWriter);
return htmlWriter.InnerWriter.ToString();

На стороне ответа они затем создают атрибут, который вы можете добавить к своим действиям MVC:

class CaptchaValidatorAttribute : ActionFilterAttribute {...}

Этот класс, воссоздающий элемент управления и вызывающий:

var recaptchaResponse = captchaValidtor.Validate();

// this will push the result value into a parameter in our Action
filterContext.ActionParameters["captchaValid"] = recaptchaResponse.IsValid;

Это означает, что ваш контроллер должен выглядеть примерно так:

[CaptchaValidator]
[AcceptVerbs( HttpVerbs.Post )]
public ActionResult CreateComment( Int32 id, bool captchaValid )
{
    if (!captchaValid)
    {
        ModelState.AddModelError("_FORM", "You did not type the verification word correctly. Please try again.");
    }
    // ...
}

Хотя проект теперь устарел, он показывает, как использовать элемент управления ASP.Net в приложении MVC.

0 голосов
/ 29 марта 2011

Механизм представления Razor не поддерживает элементы управления WebForms.Вам нужно будет найти библиотеку, специально предназначенную для работы с MVC.

0 голосов
/ 28 марта 2011

Попробуйте поместить элемент управления в тег .

...