Я нашел решение, которое включает в себя создание нового помощника 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, вместо класса, который содержит проект, который вы обычно передаете в ваше представление.