2013-02-11 2 views
4

Been подбирая MVC4 и бритву и с мячом, но у меня есть вопрос о подходе за то, что я хочу для того чтобы достигнуть:MVC4 - Razor - Содержание динамического модуля?

У меня есть страница с несколькими панелями на (как приборная панель), и набор значков, которые вы можете перетащить на эти панели, чтобы «установить» модуль на эту панель и отобразить его содержимое. Это замечательно с точки зрения пользовательского интерфейса, теперь я смотрю на закреплять это к чему-то немного пожирнее:

Что у меня есть:

  • IContentModule
  • Набор конкретных классов для каждого модуля с помощью метода Render()
  • контроллер, который обрабатывает событие падения модуля и активатором, чтобы получить экземпляр класса для этого падения модуля

Простой материал, в идеале, я хочу, чтобы каждый модуль отвечал за его собственный контент, но кроме того, что у него есть строка, возвращаемая из Render, есть лучший способ, например, назначить определенную разметку вида для этого конкретного конкретного класса, так что я могу контролировать то, что делается, но гораздо более структурированным образом, задаваясь вопросом, какой лучший подход здесь?

Спасибо за ваше время!

Дэнни

Edit: Сорт думать, если есть способ, чтобы соединить взгляд на мои конкретные классы? например ViewForum.cshtml привязывается к ForumModule.cs, каким-то образом создавая экземпляр представления и получая строку из рендеринга объекта, а затем передавая это обратно через строку, чтобы вставить ее в мою панель?

Пример панели:

<section class="main box droppable" id="MainPanel"> 
<div class="padding"> 
Panel 1 
</div> 
</section> 

Событие JQuery

$(".droppable").droppable({ 
     hoverClass: 'boxhover', 
     drop: function (event, ui) { 
      $.ajax({ 
       type: "POST", 
       url: '/Home/AddModule/' + $(ui.draggable).attr("id") + "?returnTo=" + this.id, 
       success: function(data) { 
       $("#" + data.Target).html(data.Content); 
       } 
      }); 
     } 
    }); 

Способ управления

 [AcceptVerbs(HttpVerbs.Post)] 
    public JsonResult AddModule(string id, string returnTo) 
    { 

     string content = DemoResolve(id); 
     try 
     { 
      IContentModule module = (IContentModule) Activator.CreateInstance(Type.GetType("Foo.Bar.BLLForumModule,Foo.Bar")); 
      content = module.Render(); 
     }catch(Exception exp) 
     { 
      throw; 
     } 
     return Json(new { Target = returnTo, Content = content }); 
    } 

Так где я есть, что module.Render(), я» м думать, что я хочу получить частичный вид или что-то подобное и сделать это на основе объекта, который у меня есть.

+0

Не могли бы вы опубликовать код, чтобы показать, что вы пытаетесь сделать?Трудно получить точную картину из того, что вы описываете. – levelnis

+0

Прежде чем кто-нибудь скажет, я знаю, что это лишний улов, я напишу его позже: P ... Активатор будет подключен к идентификатору модуля, который был вернулось назад, возможно, я буду использовать перечисление, чтобы вернуть тип из строки :) –

ответ

0

Работала с моим коллегой и придумала решение связать взгляды и модули вместе своего рода динамическим способом, например, если сообщение jQuery возвращается со строкой модуля BLLForumModule, мы имеют следующее:

[AcceptVerbs(HttpVerbs.Post)] 
    public JsonResult AddModule(string id, string returnTo) 
    { 

     string content = DemoResolve(id); 
     try 
     { 
      content = RenderView("BLLForumModule"); 
     }catch(Exception exp) 
     { 
      throw; 
     } 
     return Json(new { Target = returnTo, Content = content }); 
    } 

private string RenderView(string moduleName) 
    { 
     string result = ""; 

     IContentModule module = (IContentModule)Activator.CreateInstance(Type.GetType("Foo.Bar." + moduleName +",Foo.Bar")); 

     this.ViewData.Model = module; 

     using (var sw = new System.IO.StringWriter()) 
     { 

      ViewEngineResult viewResult = ViewEngines.Engines 

      .FindPartialView(this.ControllerContext, moduleName); 

      var viewContext = new ViewContext(this.ControllerContext, 

      viewResult.View, this.ViewData, this.TempData, sw); 

      viewResult.View.Render(viewContext, sw); 

      result = sw.GetStringBuilder().ToString(); 

     } 
     return result; 
    } 

Это предполагает, что есть класс в сборке foo.bar с тем же именем, что и точки зрения мы пытаемся загрузить (BLLForumModule.cshtml и Foo.Bar.BLLForumModule.cs)

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

Это кажется довольно хорошим, я думаю, любые предложения или улучшения приветствуются!

Смежные вопросы