2009-08-24 26 views
5

我的視圖使用ModelX呈現我的HTML表單,而我的控制器操作在保存表單時將ModelY作爲輸入。看起來類型安全的文本框API假定我在兩個地方使用相同的模型。ASP.NET MVC - 具有不同輸出模型的Typesafe Html.TextBoxFor

是否有可能使用不同的模型和beeing類型安全而不創建我自己的助手?

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

我想是這樣的。它存在嗎?

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

回答

1

是否有可能使用不同的模型和beeing類型安全,而無需創建我自己的助手?

只能使用繼承。所以你將擁有所有屬性的基礎模型。

考慮XForms
但我真的不明白在示例InputModel和OutputModel的目的。

+0

XForms中的一些例子適用於他的案例。 – 2009-08-24 09:28:06

+0

你可以給你一個**真實**的樣本,你想做什麼?我真的不明白你想要達到什麼(輸入和輸出模型?)。 – 2009-08-24 09:31:55

+1

Dmitriy Nagirnyak: 這個想法是,你使用一個模型來填充視圖。您可能不使用相同的模型來保存視圖中的數據。他們有不同的擔憂。 – BjartN 2009-08-24 10:23:37

13

我發現了一個解決方案,它涉及到創建一個新的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是IVi的的實施方案在Sysetm.Web.Mvc發現ewDataContainer接口:

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

感謝您展示您的解決方案!我正在想通過創建一個像'ScopedMvc​​Form'和相應的幫助器'BeginScopedForm'來擴展這個想法。我想能寫: '使用(var form = BeginScopedForm(Model.Product)){form.TextBoxFor(...)}' – Ragge 2011-05-19 14:46:27

+1

如果可以的話,我會加倍努力。它不僅回答我提出的一個直接問題(如何執行與DisplayNameFor'調用相同的操作,而且還介紹瞭如何創建HtmlHelper以及如何創建一個給定的現有視圖。 – daveaglick 2012-10-17 17:24:53

+0

@TahirHassan我們如何爲ASP.NET Core做同樣的事情? – tchelidze 2017-04-26 10:45:11

相關問題