Công cụ chế độ xem dao cạo - Làm cách nào để thêm Chế độ xem từng phần


84

Tôi đã tự hỏi, nếu có thể, đâu là cách tốt nhất để hiển thị một phần bằng cách sử dụng công cụ chế độ xem dao cạo mới. Tôi hiểu rằng đây là một cái gì đó chưa hoàn thành vào thời điểm đó

Ngay bây giờ tôi đang sử dụng RenderPage để hiển thị điều khiển của người dùng:

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

Trang gọi RenderPage sử dụng một trang bố cục (chính) với ba phần được xác định: TitleContent, HeadContent và Maincontent. Khi tôi cố gắng hiển thị điều khiển ngôn ngữ của mình từ trang này, có vẻ như các phần này cũng là bắt buộc - chúng chỉ được yêu cầu trong trang gọi và hiện có. Tôi nhận được thông báo sau, bất kể tôi có đưa các phần vào chế độ xem một phần của mình hay không (rõ ràng là tôi không muốn đưa các phần này vào nhưng nó có vẻ như là một điểm gỡ lỗi thú vị ...).

Các phần sau đã được xác định nhưng chưa được hiển thị trên trang bố cục '~ / Views / Shared / LocaleUserControl.cshtml': TitleContent; Nội dung đầu; Nội dung chính

Quan điểm một phần của tôi như sau (phỏng theo liên kết sau ):

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

Câu trả lời:


124

Một phần của bạn trông giống như một mẫu trình soạn thảo nên bạn có thể bao gồm nó như vậy (tất nhiên giả sử rằng một phần của bạn được đặt trong ~/views/controllername/EditorTemplatesthư mục con):

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

Hoặc nếu đây không phải là trường hợp đơn giản:

@Html.Partial("nameOfPartial", Model)

Cảm ơn bạn đã phản hồi ... Html.EditorFor có thể là một ý tưởng hay trong trường hợp này - nhưng tôi muốn xem các lựa chọn thay thế vì đây không phải là trường hợp cho các ví dụ phức tạp hơn - tôi chắc chắn sẽ sớm chạy lại vấn đề này. Html.Partial sẽ không hoạt động vì nó phải lấy từ ViewPage hoặc ViewUserControl trong khi dao cạo một phần bắt nguồn từ WebViewPage ...
JP.

4
Html.Partial hoạt động hoàn toàn tốt. Bắt đầu một dự án ASP.NET MVC 3 mới trong Visual Studio bằng cách sử dụng công cụ xem Razor, mở _Layout.cshtml tệp trong Sharedthư mục và kiểm tra xem việc bao gồm từ _LogOnPartial.cshtmlđó WebViewPageđược thực hiện như thế nào (sử dụng Html.Partial). Vì vậy, không, một phần không cần phải xuất phát từ ViewPagehoặc hoàn ViewUserControltoàn Html.Partialđể hoạt động.
Darin Dimitrov

1
Hmmm, có vẻ như bạn đã chính xác. Có vẻ như tôi phải sửa lỗi. Cảm ơn!
JP.

1
Tôi đã từng sử dụng Html.RenderPartialvới trang ASPX, trang này trả về giá trị vô hiệu. Html.Partialtrả về một MvcHtmlString. Vì vậy, nếu một phần của bạn chứa nhiều đánh dấu thì bạn sẽ tạo một đối tượng chuỗi rất lớn có khả năng chỉ để GC nó ngay lập tức. Có phương pháp nào hỗ trợ hiển thị trực tiếp đến đầu ra bằng Razor không?
Drew Noakes

2
@Draw Tôi nghĩ rằng gói RenderPartial thành một @{...}khối sẽ hoạt động. Không có ý tưởng nếu có một giải pháp tốt hơn.
CodesInChaos

0

Nếu bạn không muốn trùng lặp mã và giống như tôi, bạn chỉ muốn hiển thị số liệu thống kê, trong mô hình chế độ xem của mình, bạn có thể chỉ cần chuyển vào các mô hình mà bạn muốn lấy dữ liệu như vậy:

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

Sau đó, trong bộ điều khiển của bạn, chỉ cần chạy các truy vấn của bạn trên các mô hình tương ứng, chuyển chúng đến mô hình xem và trả lại, ví dụ:

GameViewModel PlayerStats = new GameViewModel();

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

[mã để kiểm tra xem kết quả]

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

Như tôi đã nói, bạn chỉ nên thực sự làm điều này nếu bạn muốn hiển thị số liệu thống kê từ các bảng có liên quan và không có phần nào khác của quá trình CRUD xảy ra, vì lý do bảo mật mà những người khác đã đề cập ở trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.