ASP.NET MVC - Typesafe Html.TextBoxFor具有不同的outputmodel

时间:2009-08-24 09:06:49

标签: asp.net-mvc

我的视图使用ModelX渲染我的HTML表单,我的控制器操作在保存表单时将ModelY作为输入。似乎typeafeafe文本框API假设我在两个地方使用相同的模型。

是否可以在不创建自己的助手的情况下使用不同的模型和安全类型?

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

我想要这样的事情。它存在吗?

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

2 个答案:

答案 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的用途。