как вернуть один элемент по его идентификатору в веб-матрице?

Как я могу запросить базу данных с помощью Web Matrix, чтобы получить один элемент, передав идентификатор с другой страницы?

Примечание. Я использую частичные страницы для большей части моего пользовательского интерфейса, это просто страницы в веб-матрице, используя:
@RenderPage("/page_name.cshtml")

Я пытаюсь составить <ul> из двух таблиц и страниц. Таблица Services, которая имеет связанную таблицу ServiceFeatures. В WebMatrix он устанавливает взаимосвязь, назначая идентификатор службы таблице ServieFeatures, то есть ServieId таблицы служб.

Итак, у меня есть две страницы для отображения <ul> одной _ServiceList.cshtml, которая имеет следующее:

@{
var db = Database.Open("winmodb");
var servicesSql = "SELECT * FROM Services WHERE Featured = 'true'";
var services = db.Query(servicesSql);

}

<div id="service-list">
@foreach(var service in services) {        
    <h2>@service.Name</h2>
    <ul>
        @RenderPage("~/shared/_ServiceFeature.cshtml", @serviceId);
    </ul>
}

And inside of _ServiceFeature.cshtml I have the following.

   @{
   var db = Database.Open("database");        
   var serviceFeatureSql = "SELECT * FROM ServiceFeatures WHERE ServiceId = @0";       
   var serviceFeature = db.QuerySingle(serviceFeatureSql, serviceId);    
}

<li>@serviceFeature.Name</li>

Но это не работает, и я не уверен, нужно ли мне передавать переменную или нет. Я знаю, что serviceId не существует в текущем контексте, вот где я застрял.


person Carl Weis    schedule 12.05.2011    source источник


Ответы (2)


На странице _ServiceList ваш вызов RenderPage должен выглядеть следующим образом:

@RenderPage("~/shared/_ServiceFeature.cshtml", service.serviceId) 

В _ServiceFeature вы можете получить значение serviceId, используя Page[0]:

db.QuerySingle(serviceFeatureSql, Page[0]);
person Mike Brind    schedule 12.05.2011
comment
Вам не нужен @ в вызове. - person SLaks; 12.05.2011
comment
Да, это так; это вводит людей в заблуждение относительно использования @, что само по себе сбивает с толку. - person SLaks; 12.05.2011

Параметры передаются в свойствах PageData (нединамические) или Page (динамические):

@RenderPage("~/shared/_ServiceFeature.cshtml", new { serviceId });

На частичной странице вы можете написать

db.QuerySingle(serviceFeatureSql, Page.serviceId);

Чтобы получить доступ к параметрам по имени, вам нужно передать их как анонимный тип.

person SLaks    schedule 12.05.2011
comment
Я думаю, вам нужен индексатор строк с PageData. Динамические свойства работают с сокращенной версией «Страница». - person Mike Brind; 12.05.2011