रेजर व्यू इंजन - मैं आंशिक दृश्य कैसे जोड़ सकता हूं


84

मैं सोच रहा था कि क्या हो सकता है, अगर यह नया रेजर व्यू इंजन का उपयोग करके आंशिक रेंडर करने का सबसे अच्छा तरीका है। मैं समझता हूं कि यह कुछ ऐसा है जो समय के अनुसार पूरी तरह से समाप्त नहीं हुआ है

अभी मैं उपयोगकर्ता नियंत्रण प्रदान करने के लिए RenderPage का उपयोग कर रहा हूं:

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

रेंडरपेज कहे जाने वाले पृष्ठ में परिभाषित तीन खंडों के साथ एक लेआउट (मास्टर) पृष्ठ का उपयोग किया गया है: टाइटलकॉन्टेंट, हेडकंटेंट और मेनकॉन्टेंट। जब मैं इस पृष्ठ से अपने स्थानीय नियंत्रण को प्रस्तुत करने का प्रयास करता हूं तो ऐसा प्रतीत होता है कि इन अनुभागों की भी आवश्यकता है - उन्हें केवल कॉलिंग पृष्ठ में आवश्यक होना चाहिए और मौजूद होना चाहिए। मुझे निम्नलिखित संदेश प्राप्त होते हैं, भले ही मैं अपने आंशिक दृश्य में खंडों को शामिल करूं या नहीं (जाहिर है कि मैं इन वर्गों को शामिल नहीं करना चाहता हूं लेकिन यह एक दिलचस्प डिबगिंग बिंदु की तरह लग रहा था ...)।

निम्नलिखित खंडों को परिभाषित किया गया है, लेकिन लेआउट पेज '~ / Views / साझा / LocaleUserControl.cshtml' पर प्रदान नहीं किया गया है: TitleContent; HeadContent; मुख्य सामग्री

मेरा आंशिक दृश्य निम्नानुसार है (निम्न लिंक से अनुकूलित ):

@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>

जवाबों:


124

आप आंशिक रूप से एक संपादक टेम्पलेट की तरह दिखते हैं ताकि आप इसे इस तरह शामिल कर सकें (यह मानकर कि आपका आंशिक ~/views/controllername/EditorTemplatesसबफ़ोल्डर में रखा गया है ):

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

या अगर यह बस मामला नहीं है:

@Html.Partial("nameOfPartial", Model)

प्रतिक्रिया के लिए धन्यवाद ... Html.EditorFor इस उदाहरण में एक अच्छा विचार हो सकता है - लेकिन मुझे विकल्प देखने में दिलचस्पी होगी क्योंकि यह अधिक जटिल उदाहरणों के लिए ऐसा नहीं है - मैं निश्चित रूप से जल्द ही इस पर फिर से चलूंगा। Html.Partial, ViewPage या ViewUserControl से प्राप्त नहीं होगी, क्योंकि रेजर आंशिक रूप से WebViewPage से प्राप्त होता है ...
JP।

4
Html.Partial पूरी तरह से ठीक काम करता है। दृश्य स्टूडियो में एक नया ASP.NET MVC 3 परियोजना उस्तरा दृश्य इंजन का प्रयोग शुरू करें, खोलने _Layout.cshtml में फ़ाइल Sharedफ़ोल्डर और चेकआउट कैसे के शामिल किए जाने _LogOnPartial.cshtmlजहाँ से व्युत्पन्न WebViewPageकिया जाता है (Html.Partial का उपयोग)। तो नहीं, आंशिक को काम करने के लिए ViewPageया ViewUserControlबिल्कुल भी प्राप्त करने की आवश्यकता नहीं है Html.Partial
डारिन दिमित्रोव

1
हम्म, ऐसा लगता है कि आप सही हैं। ऐसा भी लगता है कि मुझे कुछ डिबगिंग करने को मिली है। धन्यवाद!
जेपी।

1
मैं Html.RenderPartialASPX पृष्ठ के साथ उपयोग करता था , जो शून्य देता है। Html.Partialएक रिटर्न MvcHtmlString। इसलिए, यदि आपके आंशिक में बहुत सारे मार्कअप हैं, तो आप केवल जीसी पर तुरंत एक बहुत बड़ी स्ट्रिंग ऑब्जेक्ट बना सकते हैं। वहाँ एक दृष्टिकोण है कि रेजर का उपयोग कर सीधे आउटपुट प्रदान करने का समर्थन करता है?
ड्रू नोक

2
@ मुझे लगता है कि एक @{...}ब्लॉक में RenderPartial को लपेटकर काम करना चाहिए। बेहतर उपाय होने पर कोई विचार नहीं।
कोडइन्कॉउंस

0

यदि आप कोड को डुप्लिकेट नहीं करना चाहते हैं, और मेरी तरह आप केवल आंकड़े दिखाना चाहते हैं, तो अपने दृश्य मॉडल में, आप उन मॉडलों में उत्तीर्ण हो सकते हैं, जिन्हें आप इस तरह से डेटा प्राप्त करना चाहते हैं:

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

फिर, अपने कंट्रोलर में संबंधित मॉडल पर अपने प्रश्नों को चलाएं, उन्हें व्यू मॉडल में पास करें और उसे वापस करें, उदाहरण:

GameViewModel PlayerStats = new GameViewModel();

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

[कोड अगर परिणाम की जाँच करने के लिए]

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

जैसा कि मैंने कहा, आपको वास्तव में ऐसा तभी करना चाहिए जब आप संबंधित तालिकाओं से आंकड़े प्रदर्शित करना चाहते हैं, और सीआरयूडी प्रक्रिया का कोई अन्य हिस्सा नहीं हो रहा है, सुरक्षा कारणों से अन्य लोगों ने ऊपर उल्लेख किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.