2009-08-24 12 views
5

farklı outputmodel ile türgüvenli Html.TextBoxFor girdi olarak ModelY sürer. Her iki yerde de aynı modeli kullanacağımı varsaydığı gibi, güvenli bir metin kutusu API'sı görünüyor.ASP.NET MVC - formunu kaydederken Bence benim HTML formu ve benim denetleyicisi eylemi işlemek için ModelX kullanır

bu benim kendi yardımcıları yaratmadan farklı modeller ve güvenli türünü beeing kullanmak mümkün mü?

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

Böyle bir şey istiyorum. Var mı?

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

cevap

1

bu benim kendi yardımcıları yaratmadan farklı modeller ve güvenli türünü beeing kullanmak mümkün mü? Sadece devralma kullanarak

. Böylece tüm özelliklere sahip bir temel modele sahip olacaksınız.

XForms düşünün.
Ancak örnekte InputModel ve OutputModel'in amacını gerçekten anlamıyorum.

+0

XForms'taki durumuyla ilgili bazı örneklere ne dersiniz? –

+0

Yapmak istediğiniz şeyin ** gerçek ** bir örneğini verebilir misiniz? Neyi başarmaya çalıştığınızı anlamıyorum (Giriş ve Çıkış modeli?). –

+1

Dmitriy Nagirnyak: fikir görünümünü doldurmak için bir modeli kullanmak olmasıdır. Verileri görünümden kaydetmek için aynı modeli kullanamazsınız. Onlar farklı kaygılar var. – BjartN

13

yeni bir HTML yardımcı oluşturma içeren bir çözüm bulmuşlardır. OP, aynı sınıfın, eylem yönteminin yanı sıra görünüm sayfası için bir parametre olarak kullanılmasının uygunsuz olduğunu söylemekte doğrudur. Bazen ViewPage'e daha fazla bilgiyi kullanıcı form formunda bize geri bildirdiğinden daha fazla aktarmak istiyoruz.

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

ve sonra aşağıdaki gibi kullanılır::

ben ile geldi çözeltisi I aşağıdaki kullanmak HtmlHelperFor (T obj) olarak adlandırılan bir HtmlHelper uzantısı yöntemi kullanmaktır

<%= productForm.TextBoxFor(x => x.Name) %> 

uzantısı yöntemi aşağıdaki gibidir:

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 bir uygulamasıdır Sysetm.Web.Mvc bulunan ewDataContainer arayüzü:

public class ViewDataContainer : System.Web.Mvc.IViewDataContainer 
{ 
    public ViewDataContainer(System.Web.Mvc.ViewDataDictionary viewData) 
    { 
     ViewData = viewData; 
    } 

    public System.Web.Mvc.ViewDataDictionary ViewData { get; set; } 
} 

yukarıdaki aramalar yerine bir sınıfın, sen POST kabul eden yöntemin parametreleri çerçevesinde bir Product nesne var sağlayacak projeyi içeren seni normalde görüşünüze geçerdi.

+1

Çözümünüzü gösterdiğiniz için teşekkür ederiz! “ScopedMvcForm” ve ilgili yardımcı “BeginScopedForm” gibi bir şey yaratarak fikri genişletmeyi düşünüyorum.Yazmak istiyorum: 'kullanarak (var form = BeginScopedForm (Model.Ürün)) {form.TextBoxFor (...)}' – Ragge

+1

Eğer yapabilirsem birkaç kez bunu kabul ediyorum. Sadece bir soruya cevap vermekle kalmıyor aynı zamanda ('DisplayNameFor' çağrıları için de aynı işlemin nasıl yapılacağı sorusu) değil, aynı zamanda bir HtmlHelper'ın nasıl oluşturulduğu ve varolan bir görünümün nasıl oluşturulduğu hakkında da iyi bir pencere sunuyor. . – daveaglick

+0

@TahirHassan ASP.NET Core için nasıl yapabiliriz? – tchelidze

İlgili konular