เครื่องมือดูมีดโกน - ฉันจะเพิ่มมุมมองบางส่วนได้อย่างไร


84

ฉันสงสัยว่าถ้าเป็นไปได้วิธีที่ดีที่สุดในการแสดงผลบางส่วนโดยใช้เครื่องมือมุมมองมีดโกนใหม่ ฉันเข้าใจว่านี่เป็นสิ่งที่ยังไม่เสร็จสมบูรณ์ตามเวลา

ตอนนี้ฉันใช้ RenderPage เพื่อแสดงการควบคุมผู้ใช้:

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

เพจที่เรียกใช้ RenderPage ใช้เพจเลย์เอาต์ (ต้นแบบ) ที่มีการกำหนดสามส่วน: TitleContent, HeadContent และ Maincontent เมื่อฉันพยายามที่จะแสดงผลการควบคุมโลแคลของฉันจากหน้านี้ดูเหมือนว่าส่วนเหล่านี้จำเป็นด้วย - ควรจำเป็นในหน้าการเรียกเท่านั้นและจะปรากฏอยู่ ฉันได้รับข้อความต่อไปนี้ไม่ว่าฉันจะรวมส่วนต่างๆไว้ในมุมมองบางส่วนของฉันหรือไม่ (เห็นได้ชัดว่าฉันไม่ต้องการรวมส่วนเหล่านี้ แต่ดูเหมือนว่าจะเป็นจุดดีบักที่น่าสนใจ ... )

มีการกำหนดส่วนต่อไปนี้ แต่ยังไม่ได้แสดงผลในหน้าเค้าโครง '~ / Views / Shared / 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>

คำตอบ:


125

บางส่วนของคุณดูเหมือนเทมเพลตบรรณาธิการมากดังนั้นคุณจึงสามารถรวมไว้ในรูปแบบนี้ได้ (โดยสมมติว่าบางส่วนของคุณอยู่ใน~/views/controllername/EditorTemplatesโฟลเดอร์ย่อย):

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

หรือหากไม่ใช่กรณีนี้ให้ทำดังนี้

@Html.Partial("nameOfPartial", Model)

ขอบคุณสำหรับคำติชม ... Html.EditorFor อาจเป็นความคิดที่ดีในกรณีนี้ แต่ฉันสนใจที่จะเห็นทางเลือกอื่นเนื่องจากไม่ใช่กรณีตัวอย่างที่ซับซ้อนกว่านี้ฉันจะพบสิ่งนี้อีกครั้งในไม่ช้า Html.Partial จะไม่ทำงานเนื่องจากต้องมาจาก ViewPage หรือ ViewUserControl ในขณะที่มีดโกนบางส่วนมาจาก WebViewPage ...
JP

4
Html บางส่วนทำงานได้ดีอย่างสมบูรณ์ เริ่มโปรเจ็กต์ ASP.NET MVC 3 ใหม่ใน Visual Studio โดยใช้เอ็นจินมุมมอง Razor เปิด_Layout.cshtml ไฟล์ในSharedโฟลเดอร์และตรวจสอบว่าการรวม_LogOnPartial.cshtmlที่มาจากWebViewPageนั้นทำอย่างไร (โดยใช้ Html.Partial) ดังนั้นไม่จำเป็นบางส่วนไม่จำเป็นต้องได้มาจากViewPageหรือViewUserControlเลยเพื่อHtml.Partialการทำงาน
Darin Dimitrov

1
อืมดูเหมือนว่าคุณจะถูกต้อง ดูเหมือนว่าฉันมีการดีบักบางอย่างที่ต้องทำ ขอบคุณ!
JP.

1
ฉันเคยใช้Html.RenderPartialกับเพจ ASPX ซึ่งคืนค่าเป็นโมฆะ Html.Partialส่งคืนMvcHtmlStringไฟล์. ดังนั้นหากบางส่วนของคุณมีมาร์กอัปจำนวนมากคุณจะสร้างออบเจ็กต์สตริงที่มีขนาดใหญ่มากเฉพาะสำหรับ GC ทันที มีแนวทางที่รองรับการแสดงผลโดยตรงไปยังเอาต์พุตโดยใช้ Razor หรือไม่?
Drew Noakes

2
@Draw ฉันคิดว่าการห่อ RenderPartial ลงใน@{...}บล็อกน่าจะใช้ได้ ไม่รู้ว่ามีทางออกที่ดีกว่านี้หรือไม่
CodesInChaos

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;

อย่างที่ฉันพูดไปคุณควรทำสิ่งนี้จริงๆก็ต่อเมื่อคุณต้องการแสดงสถิติจากตารางที่เกี่ยวข้องและไม่มีส่วนอื่น ๆ ของกระบวนการ CRUD เกิดขึ้นด้วยเหตุผลด้านความปลอดภัยที่คนอื่นกล่าวถึงข้างต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.