2010-08-31 41 views
1

非開發人員希望能夠修改用戶在多個屏幕上閱讀的腳本。.NET MVC如何基於外部XML呈現表單?

例如,第一個腳本可能會顯示「感謝致電,我該如何幫助您?」幷包含一些輸入元素。在此屏幕上單擊「下一步」按鈕後,它們將以另一種形式與另一個具有更多輸入元素的腳本一起呈現。

他們如何在兩者之間「插入」屏幕上方從外部文件中讀取一個輕量級的XML風格的語言提到的兩個屏幕(之前後)?這個文件將包含簡單的,非開發人員可讀的標籤,如<text>blah blah blah</text>,<button>Next</button>包圍<screen></screen>,我可以翻譯成隱藏和可顯示<div>標籤。它也應該是cache-able因此,所有屏幕都可以在用戶登錄時或在應用程序進程中的某個較早時間加載隱藏。

到目前爲止我所想到的是button.onclick中的jQuery來隱藏當前div並顯示下一個。我不確定如何使用MVC在以前的某個時間在客戶端推送所有這些數據。我想,餅乾對於緩存大塊文本來說太小了。我應該看看幀:: shudder ::?

基本上,這個.NET MVC應用程序需要動態緩存基於外部源的視圖,以創建一個能夠被非開發人員修改的「動態」屏幕工作流程。可以強制用戶註銷並重新緩存這些屏幕。

請讓我知道如果這不清楚,我很樂意詳細說明。

+0

如果這種非開發者也可以定義每個屏幕(如它們的類型上的動態輸入字段 - 文本框,下拉列表,收音機,複選框,textarea,...以及他們的名字和相關標籤)? – 2010-08-31 20:57:16

+0

我不這麼認爲。我想保留所有的模型。我知道在實際上有新字段的情況下需要更新它,但是這些腳本只是在用戶輸入的數據變化較少時才被用戶讀取。 – 2010-08-31 20:59:11

+0

所以,如果我正確理解你的場景,你需要這個人能夠爲每個頁面定義一個標題,並指明哪一個是下一個頁面的按鈕(以前如何?),但用戶填寫的表單的設計保持固定含義他將有一個有限的頁面從他的XML中進行選擇並定義導航工作流程? – 2010-08-31 21:02:39

回答

1

這裏是你可以嘗試什麼:

開始通過設計每次你想有與它的輸入框的頁面。然後你可以定義視圖模型,控制器和相應的視圖。它可能是這個樣子(簡單化):

的ViewModels:

/// <summary> 
/// Represents a button with its text and 
/// the controller name it will redirect to 
/// </summary> 
public class Button 
{ 
    public string Text { get; set; } 
    public string Controller { get; set; } 
} 

/// <summary> 
/// Represents the page with a header and a list of buttons 
/// </summary> 
public class Page 
{ 
    public string Header { get; set; } 
    public IEnumerable<Button> Buttons { get; set; } 
} 

/// <summary> 
/// Each view model will have page metadata 
/// </summary> 
public abstract class BaseViewModel 
{ 
    public Page Page { get; set; } 
} 

public class Page1ViewModel : BaseViewModel 
{ 
    // Put any properties specific to this page 
    // which will be used for the input fields 
} 

public class Page2ViewModel : BaseViewModel 
{ 
    // Put any properties specific to this page 
    // which will be used for the input fields 
} 

... 

然後創建一個存儲庫,將解析XML(實施留給簡潔):

public interface IPagesRepository 
{ 
    Page ReadPage(string pageName); 
} 

那麼這裏頁面控制器的外觀如何:

public class Page1Controller : Controller 
{ 
    private readonly IPagesRepository _repository; 
    // TODO: to avoid repeating this ctor you could have 
    // a base repository controller which others derive from 
    public Page1Controller(IPagesRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     var model = new Page1ViewModel(); 
     model.Page = _repository.ReadPage("page1"); 
     //model.Page = new Page 
     //{ 
     // Header = "Thanks for calling, how may I help you?", 
     // Buttons = new[] 
     // { 
     //  new Button { Text = "Next", Controller = "Page2" }, 
     //  new Button { Text = "Address", Controller = "Page3" }, 
     // } 
     //}; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(Page1ViewModel model, string redirectTo) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 
     return Redirect(redirectTo); 
    } 
} 

而最後一部分是更改esponding觀點:

<script type="text/javascript"> 
$(function() { 
    // when a navigation link is clicked set the redirectTo 
    // hidden field to the value of the controller we 
    // want to redirect to and submit the form 
    $('.nav a').click(function() { 
     $('form :hidden[name=redirectTo]').val(this.href); 
     $('form').submit(); 
     return false; 
    }); 
}); 
</script> 

<h2><%: Model.Page.Header %></h2> 

<%: Html.ValidationSummary() %> 

<% using (Html.BeginForm()) { %> 
    <%: Html.Hidden("redirectTo") %> 
    <!-- TODO: Put here the specific input fields for this page --> 
<% } %> 

<div class="nav"> 
    <%: Html.EditorFor(x => x.Page.Buttons) %> 
</div> 

而且Button.ascx編輯模板,這將使得導航鏈接:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeNs.Models.Button>" %> 
<!-- Here we assume Index action is setup by default in the routes --> 
<%: Html.ActionLink(Model.Text, "index", Model.Controller) %> 
+0

哇!我很感激你花時間把這個想法拼湊在一起。我會試着今晚看看,並告訴你我能從中得到什麼。乍一看,它看起來很棒。我繼續塗鴉,並提出了一個可能的選擇:大ViewModel構建了一堆div(我最初隱藏),但我覺得這可能是很多jQuery – 2010-08-31 22:11:30

+0

我很抱歉,但我現在意識到我的規格可能不完整 - 我可以通過AJAX驗證每個ViewModel而不是普通郵件嗎?我的「大ViewModel」的要點是在登錄後立即將所有屏幕(div)一次性放下,並通過AJAX驗證保存一些請求。這可能嗎?直到最終提交之前,大ViewModel纔會被驗證,然後某種響應可以指示哪個div根據哪個屏幕(div)出現驗證問題呈現可見。 – 2010-09-01 14:19:40