gpt4 book ai didi

asp.net-mvc - ASP.NET MVC - 具有不同输出模型的类型安全 Html.TextBoxFor

转载 作者:行者123 更新时间:2023-12-02 10:47:00 25 4
gpt4 key购买 nike

我的 View 使用 ModelX 来呈现 HTML 表单,并且我的 Controller 操作在保存表单时将 ModelY 作为输入。看来类型安全文本框 API 假设我在两个地方使用相同的模型。

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

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

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

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

最佳答案

我找到了一个解决方案,其中涉及创建一个新的 html 助手。 OP 正确地说,有时使用同一类作为操作方法和 View 页面的参数是不合适的。有时,我们希望向 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 接口(interface)的实现:

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 的方法参数的一部分,而不是包含通常传递到 View 的项目的类。

关于asp.net-mvc - ASP.NET MVC - 具有不同输出模型的类型安全 Html.TextBoxFor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1321254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com