2009-08-24 10 views
5

私のビューはModelXを使用してHTMLフォームをレンダリングし、コントローラアクションはフォームを保存するときにModelYを入力として受け取ります。タイプセーフなテキストボックスAPIは、私が両方の場所で同じモデルを使用していると仮定しているようです。ASP.NET MVC - 異なる出力モデルを持つタイプセーフ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のいくつかの例は、彼のケースに当てはまります。 –

+0

あなたは何をしたいのですか**本当の**サンプルを与えることができますか?私はあなたが達成しようとしていることを本当に理解していません(入力と出力のモデル?)。 –

+1

Dmitriy Nagirnyak: 考え方は、1つのモデルを使用してビューを生成することです。同じモデルを使用して、ビューからデータを保存することはできません。彼らは異なった関心事です。 – BjartN

13

新しいhtmlヘルパーを作成するという解決策が見つかりました。 OPは、アクションメソッドとビューページのパラメータとして同じクラスを使用することは、時には不適切であるという点で正しいです。時には、ユーザーがフォームの投稿で私たちに返すものよりも多くの情報をViewPageに渡したい場合があります。

<% var productForm = Html.HtmlHelperFor(Model.Product); %> 

を、その後、私は以下のようにそれを使用する:

私が思いついた解決策は、私は以下のように使用HtmlHelperFor(TのOBJ)と呼ばHtmlHelperの拡張メソッドを使用することである

<%= 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; } 
} 

上記の呼び出しは、あなたがPOSTを受け取るメソッドのパラメータの一部として、代わりにあなたのプロジェクトが含まれているクラスのProductオブジェクトを持つことができるようになります通常はあなたの見解に合格します。

+1

あなたの解決策を提示してくれてありがとう!私は 'ScopedMvc​​Form'のようなものを作成し、そのヘルパー' BeginScopedForm'を作成することでアイデアを広げようと考えています。私は書くことができるようにしたいと思います: '(var form = BeginScopedForm(Model.Product)){form.TextBoxFor(...)}'を使用しています。 – Ragge

+1

できれば私はこれを何度もupvoteします。私が持っていた直接の質問に答えるだけでなく(DisplayNameForの呼び出しと同じ操作を行う方法)、HtmlHelperの作成方法と既存のビューを作成する方法についての良いウィンドウも提供します。 – daveaglick

+0

@TahirHassan ASP.NETコアではどうやって同じことができますか? – tchelidze

関連する問題