2010-12-08 2 views
3

The closest I found to my question was this but I don't understand how it would be used.MVC, C# Передача parent.id дочернему индексу или создание действия?

<% object parentModel = ViewContext.ParentActionViewContext.ViewData.Model; %> 

У меня есть шлюза стол и датчика таблицу. Шлюзы могут иметь несколько датчиков. Таблицы имеют связь от 1 до многих (шлюз к датчику), а таблица датчиков имеет поле шлюза, по которому датчик связан с шлюзом.

Я использую рамку сущности У меня есть класс репозитория шлюза У меня есть класс контроллера шлюза У меня есть частичный класс напарника шлюза для обработки аннотаций данных у меня есть индексный просмотр, который содержит список шлюзов и обеспечивает классические crud pages

В списке шлюзов я добавил ссылку для подключения к датчикам, связанным с данным шлюзом.

Все хорошее до сих пор (надеюсь).

Я предполагаю, что теперь я должен создать ту же настройку для моей таблицы датчиков; хранилище, контроллер, класс друзей и т. д.

Q1: Что такое подход MVC к перечислению всех датчиков (дочерних записей) для данного шлюза (родительская запись)?

На каждой линии элемента шлюза я генерировал ссылку, которая выглядит следующим образом:

localhost/sensor/list/5 

Это указывает на то, что список должен отображать только датчики для текущего шлюза.

Я не думаю, что это правильный путь. Я думаю, что я должен быть пропусканием модели шлюза в фоновом режиме, так что в любое время я оформить ссылку так:

localhost/sensor/ 

было бы просто понять контекст текущего шлюза.

Q2: Следующая проблема заключается в том, как сделать то же самое для создания датчика. Я могу настроить контроллер создания и выставить форму представления, но как указать, с каким шлюзом должен быть связан датчик?

В верхней части класса SensorController:

SensorRepository repository = new SensorRepository(); 
GatewayRepository Grepository = new GatewayRepository(); 

Мой список Датчик метод ActionResult выглядит следующим образом:

public ActionResult List(int id) 
{ 
    Gateway gateway = Grepository.GetGateway(id); 

    var sensors = repository.FindGatewaySensors(id); 
    return View(sensors); 
} 

Мой датчик Создать ActionResult метод выглядит следующим образом (обратите внимание, что я устанавливаю значение шлюза перед его прохождением к виду, оно не редактируется в форме просмотра):

// GET: /Sensor/Create 
public ActionResult Create(int id) 
{ 
    Sensor sensor = new Sensor(); 

    sensor.gatewayid = id; 
    return View(sensor); 

} 

Вот Создать ActionResult пост метод:

[HttpPost] 
public ActionResult Create(FormCollection collection) 
{ 

    Sensor sensor = new Sensor(); 

    if (TryUpdateModel(sensor)) 
    { 
     repository.Add(sensor); 
     repository.Save(); 
     return RedirectToAction("List", new { id = sensor.gatewayid }); 
    } 
    return View(sensor); 
} 

Но это просто не кажется правильным. Готов поспорить, есть простой подход, который мне не хватает. Пожалуйста, просветите меня.

+0

Пожалуйста, [не используйте подписи или подписи] (http://stackoverflow.com/faq#signatures) в своих сообщениях. – meagar 2010-12-08 05:13:06

ответ

0

Не знаю, актуально ли это (старый вопрос), но вот некоторые мнения по этому поводу (и не более чем мнения).

Для Q1 я предпочитаю использовать то, что, по моему мнению, является «логическим» URL-адресом с MVC - то есть с точки зрения пользователя, URL-адрес должен сообщить им, какой ресурс они могут извлечь. Так как вы можете сделать некоторые полу-фантазии маршрутизации, возможно, маршрут, такие как это было бы умным:

/шлюзы/5/sensorlist

Или некоторые вариации на эту тему. Конечно, существует несколько способов установить «текущий» шлюз, например, как переменную сеанса или файл cookie сеанса, но что тогда кто-то копирует URL-адрес, отправив его другу, сказав: «Проверьте датчики на ЭТО плохой шлюз! " - он не будет работать без ссылки на шлюз (не обязательно должен быть ID, некоторые люди думают, что выявление идентификаторов базы данных - это плохо).

Что касается Q2, то моим общим решением для этого является включение скрытого поля в виде представления вида, указывающего идентификатор шлюза, для которого вы хотите создать датчик. Он чист, и он работает, и этого обычно достаточно для меня.

Если вы все еще ожидаете ответа через полгода, я надеюсь, что это поможет! :)