Razor görünüm motoru - Kısmi Görünümleri nasıl ekleyebilirim


84

Yeni jilet görüntüleme motorunu kullanarak bir parçayı oluşturmanın en iyi yolunun mümkünse ne olduğunu merak ediyordum. Bunun o zamana kadar tamamen bitmemiş bir şey olduğunu anlıyorum

Şu anda kullanıcı denetimini işlemek için RenderPage kullanıyorum:

@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)

RenderPage'i çağıran sayfa, üç bölümün tanımlandığı bir düzen (ana) sayfası kullanır: TitleContent, HeadContent ve Maincontent. Yerel ayar kontrolümü bu sayfadan oluşturmaya çalıştığımda, bu bölümlerin de gerekli olduğu anlaşılıyor - bunlar yalnızca arama sayfasında gerekli olmalı ve mevcut. Kısmi görünümüme bölümleri dahil edip etmediğimden bağımsız olarak aşağıdaki iletiyi alıyorum (açıkçası bu bölümleri dahil etmek istemiyorum ama ilginç bir hata ayıklama noktası gibi görünüyordu ...).

Aşağıdaki bölümler tanımlanmış ancak '~ / Views / Shared / LocaleUserControl.cshtml' yerleşim sayfasında oluşturulmamış: TitleContent; HeadContent; Ana içerik

Kısmi görüşüm aşağıdaki gibidir (aşağıdaki bağlantıdan uyarlanmıştır ):

@inherits System.Web.Mvc.WebViewPage<LocaleBaseModel>
@using System.Web.UI;

<p>
     @Html.LabelFor(model => Model.CountryName)
    <br />
    @Html.DropDownListFor(model => Model.CountryName,null, string.Empty, new { @class = "text", accesskey="u"})
</p>
<p>
     @Html.LabelFor(model => Model.StateProvince)
    <br />
     @Html.DropDownListFor(model => Model.StateProvince, null, string.Empty, new { @class = "text", accesskey="t" })
</p>


<script type="text/javascript">
    $(function () {
        var countries = $("#CountryName");
        var statesprovinces = $("#StateProvince");
        countries.change(function () {
            statesprovinces.find('option').remove();
            var url = '@Url.Action("GetStatesProvinces", "Base")';
            $.getJSON(url, { countryId: countries.val() }, function (data) {
                $(data).each(function () {
                    $("<option value=" + this.ID + ">" + this.Name + "</option>").appendTo(statesprovinces);
                });
            });
        });
    });
</script>

Yanıtlar:


125

Kısmi, bir düzenleyici şablonuna çok benziyor, bu yüzden onu bu şekilde dahil edebilirsiniz (elbette, ~/views/controllername/EditorTemplateskısmınızın alt klasöre yerleştirildiğini varsayarak ):

@Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel)

Veya durum böyle değilse basitçe:

@Html.Partial("nameOfPartial", Model)

Geri bildiriminiz için teşekkürler ... Html.EditorFor bu durumda iyi bir fikir olabilir - ancak daha karmaşık örnekler için durum böyle olmadığından alternatifleri görmek isterim - kesinlikle yakında bununla tekrar karşılaşacağım. Html.Partial, ViewPage veya ViewUserControl'den türetilmesi gerektiği için çalışmaz, oysa jilet kısmı WebViewPage ...
.

4
Html.Partial mükemmel çalışıyor. Ustura görünüm motorunu kullanarak Visual Studio'da yeni bir ASP.NET MVC 3 projesi başlatın açmak _Layout.cshtml dosyayı Shareddahil nasıl klasöründen ve ödeme _LogOnPartial.cshtmldan hangi türemiştir WebViewPageyapılır (Html.Partial kullanarak). Yani hayır, kısmi olanın işe yaraması için ViewPageya da ViewUserControlhiç türetilmesi gerekmez Html.Partial.
Darin Dimitrov

1
Hmmm, haklısın gibi görünüyor. Ayrıca yapmam gereken bazı hata ayıklamalarım var gibi görünüyor. Teşekkürler!
JP.

1
Html.RenderPartialVoid döndüren ASPX sayfası ile kullanıyordum . Html.Partialdöndürür bir MvcHtmlString. Bu nedenle, eğer parçanız çok fazla biçimlendirme içeriyorsa, yalnızca hemen GC için potansiyel olarak çok büyük bir dize nesnesi oluşturacaksınız. Razor kullanarak doğrudan çıktıya oluşturmayı destekleyen bir yaklaşım var mı?
Drew Noakes

2
@Draw RenderPartial'ı bir @{...}bloğa sarmanın işe yarayacağını düşünüyorum . Daha iyi bir çözüm olup olmadığı hakkında hiçbir fikrim yok.
CodesInChaos

0

Eğer kodu kopyalamak istemiyorsan ve benim gibi sadece istatistikleri göstermek istiyorsan, görünüm modelinde, veri almak istediğin modelleri şöyle aktarabilirsin:

public class GameViewModel
{
    public virtual Ship Ship { get; set; }
    public virtual GamePlayer GamePlayer { get; set; }     
}

Ardından, denetleyicinizde yalnızca sorgularınızı ilgili modeller üzerinde çalıştırın, bunları görünüm modeline aktarın ve geri döndürün, örneğin:

GameViewModel PlayerStats = new GameViewModel();

GamePlayer currentPlayer = (from c in db.GamePlayer [more queries]).FirstOrDefault();

[sonuçları kontrol etmek için kod]

//pass current player into custom view model
PlayerStats.GamePlayer = currentPlayer;

Dediğim gibi, bunu yalnızca ilgili tablolardan istatistikleri görüntülemek istiyorsanız ve CRUD sürecinin başka hiçbir parçası olmadığında, diğer insanların yukarıda bahsettiği güvenlik nedenleriyle gerçekten yapmalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.