ASP.NET MVC - Typesafe Html.TextBoxFor с другой выходной моделью - PullRequest
5 голосов
/ 24 августа 2009

Мое представление использует ModelX для визуализации моей HTML-формы, и мое действие контроллера принимает ModelY в качестве входных данных при сохранении формы. Похоже, что API текстового окна для безопасности типов предполагает, что я использую одну и ту же модель в обоих местах.

Можно ли использовать различные модели и безопасный тип пчелы, не создавая моих собственных помощников?

<% = Html.TextBoxFor(x => x.Text) %>

Я бы хотел что-то вроде этого. Это существует?

<% = Html.TextBoxFor<InputModel,OutputModel>(input=>input.Text, output=>output.SomeOtherText)

Ответы [ 2 ]

13 голосов
/ 02 июня 2010

Я нашел решение, которое включает в себя создание нового помощника HTML. ОП правильно говорит, что иногда неуместно использовать один и тот же класс в качестве параметра для метода действия, а также для страницы просмотра. Иногда мы хотим передать БОЛЬШЕ информации в ViewPage, чем то, что пользователь возвращает нам в форме сообщения.

Решение, которое я нашел, заключается в использовании метода расширения HtmlHelper, который я назвал HtmlHelperFor (T obj), который я использую, как показано ниже:

<% var productForm = Html.HtmlHelperFor(Model.Product); %>

и затем я использую его, как показано ниже:

<%= productForm.TextBoxFor(x => x.Name) %>

Метод расширения приведен ниже:

public static HtmlHelper<T> HtmlHelperFor<T>(this HtmlHelper html, T model)
{
    var newViewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) { Model = model };
    ViewContext newViewContext = new ViewContext(html.ViewContext.Controller.ControllerContext, html.ViewContext.View, newViewData, html.ViewContext.TempData, html.ViewContext.Writer);
    var viewDataContainer = new ViewDataContainer(newViewContext.ViewData);
    return new HtmlHelper<T>(newViewContext, viewDataContainer, html.RouteCollection);
}

ViewDataContainer является реализацией интерфейса IViewDataContainer, найденного в Sysetm.Web.Mvc:

public class ViewDataContainer : System.Web.Mvc.IViewDataContainer
{
    public ViewDataContainer(System.Web.Mvc.ViewDataDictionary viewData)
    {
        ViewData = viewData;
    }

    public System.Web.Mvc.ViewDataDictionary ViewData { get; set; }
}

Вышеуказанные вызовы позволят вам иметь Product объект как часть параметров метода, который принимает POST, вместо класса, который содержит проект, который вы обычно передаете в ваше представление.

1 голос
/ 24 августа 2009

Можно ли использовать различные модели и безопасный тип пчелы, не создавая моих собственных помощников?

Только с использованием наследования. Таким образом, у вас будет базовая модель со всеми свойствами.

Рассмотрим XForms .
Но я не очень понимаю назначение InputModel и OutputModel в примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...