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

Bja*_*rtN 5 asp.net-mvc

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

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

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

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

<% = Html.TextBoxFor<InputModel,OutputModel>(input=>input.Text, output=>output.SomeOtherText)
Run Code Online (Sandbox Code Playgroud)

Tah*_*san 13

我找到了一个解决方案,涉及创建一个新的html帮助器.OP是正确的说,有时候使用相同的类作为action方法和viewpage的参数是不合适的.有时我们希望将更多信息传递给ViewPage,而不是用户在表单帖子中返回给我们的信息.

我想出的解决方案是使用HtmlHelper扩展方法,我称之为HtmlHelperFor(T obj),我使用如下:

<% var productForm = Html.HtmlHelperFor(Model.Product); %>
Run Code Online (Sandbox Code Playgroud)

然后我用它如下:

<%= productForm.TextBoxFor(x => x.Name) %>
Run Code Online (Sandbox Code Playgroud)

扩展方法如下:

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);
}
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

上面的调用将允许您将一个Product对象作为接受POST的方法的参数的一部分,而不是包含您通常传递给视图的项目的类.


Dmy*_*iak 1

是否可以使用不同的模型和蜜蜂类型安全而无需创建自己的助手?

只能通过使用继承。所以你将拥有具有所有属性的基础模型。

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