我的视图使用ModelX渲染我的HTML表单,我的控制器操作在保存表单时将ModelY作为输入。似乎typeafeafe文本框API假设我在两个地方使用相同的模型。
是否可以在不创建自己的助手的情况下使用不同的模型和安全类型?
<% = Html.TextBoxFor(x => x.Text) %>
我想要这样的事情。它存在吗?
<% = Html.TextBoxFor<InputModel,OutputModel>(input=>input.Text, output=>output.SomeOtherText)
答案 0 :(得分:13)
我找到了一个涉及创建新的html助手的解决方案。 OP是正确的说,有时候使用相同的类作为action方法和viewpage的参数是不合适的。有时我们希望将更多信息传递给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是Sysetm.Web.Mvc中的IViewDataContainer接口的实现:
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 :(得分:1)
是否可以在不创建自己的助手的情况下使用不同的模型和安全类型?
仅使用继承。所以你将拥有包含所有属性的基础模型。
考虑XForms 但我并不真正理解样本中InputModel和OutputModel的用途。