【问题标题】:ASP.NET MVC - Typesafe Html.TextBoxFor with different outputmodelASP.NET MVC - 具有不同输出模型的 Typesafe Html.TextBoxFor
【发布时间】:2009-08-24 09:06:48
【问题描述】:

我的视图使用 ModelX 来呈现我的 HTML 表单,并且我的控制器操作在保存表单时将 ModelY 作为输入。似乎类型安全的文本框 API 假定我在两个地方都使用相同的模型。

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

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

我想要这样的东西。存在吗?

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

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我找到了一个涉及创建新 html 帮助程序的解决方案。 OP 正确地说,有时将同一类用作操作方法和视图页面的参数是不合适的。有时我们希望向 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 的方法的参数的一部分,而不是包含通常传递给视图的项目的类。

    【讨论】:

    • 感谢您展示您的解决方案!我正在考虑通过创建类似ScopedMvcForm 和相应的助手BeginScopedForm 来扩展这个想法。我希望能够写:using(var form = BeginScopedForm(Model.Product)) { form.TextBoxFor(...) }
    • 如果可以的话,我会多次投票。它不仅回答了我的一个直接问题(如何执行问题描述的相同操作,但对于DisplayNameFor 调用),而且它还提供了一个很好的窗口来了解如何创建 HtmlHelper 以及如何在给定现有视图的情况下创建 HtmlHelper .
    • @TahirHassan 我们如何为 ASP.NET Core 做同样的事情?
    【解决方案2】:

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

    仅通过使用继承。因此,您将拥有包含所有属性的基本模型。

    考虑XForms
    但是我不太明白示例中 InputModel 和 OutputModel 的用途。

    【讨论】:

    • XForms 中适用于他的案例的一些示例怎么样?
    • 您能否提供一个真实示例来说明您想要做什么?我真的不明白你想要实现什么(输入和输出模型?)。
    • Dmitriy Nagirnyak:这个想法是您使用一个模型来填充视图。您可能不会使用相同的模型来保存视图中的数据。他们有不同的关注点。
    • 我经常有不同的模型用于视图和作为操作的输入参数。但我仍然不需要视图中的输入模型。您的视图应使用 视图模型 而不是输入模型。如果它们相似,您可以使用继承、聚合或只是相同的模型来查看和输入(在简单的情况下)。此外,您希望从您提供的样本中得到什么输出?能给个真实的样品吗?
    猜你喜欢
    • 2015-08-15
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多