2013-06-18 85 views
0

我試圖研究一下,但還沒有找到適當的解決方案。Razor MVC返回HTML

我試圖做的是有一個HTML.Action在頁面像這樣

Html.Action("Calendar", "GlobalShared") 

裏面的行動「日曆」,我需要回到傳統的日曆的HTML的結果控制

public ActionResult Calendar(
        String ID, 
        String CssClass, 
        int CellSpacing, 
        int CellPadding, 
        String BorderWidth, 
        String ShowGridLines, 
        String ShowTitle, 
        String DayNameFormat 
      ) 
     { 
      System.Web.UI.WebControls.Calendar cal = new System.Web.UI.WebControls.Calendar(); 
      cal.ID = "MyCalendar"; 
      cal.CssClass = "month-view"; 
      cal.CellSpacing = 0; 
      cal.CellPadding = -1; 
      cal.BorderWidth = 0; 
      cal.ShowGridLines = false; 
      cal.ShowTitle = false; 
      cal.DayNameFormat = System.Web.UI.WebControls.DayNameFormat.Full; 

     } 

我該怎麼做?順便說一句,我使用HTML.Action是因爲我讀它返回一個HTML字符串,是否正確或我應該做一些其他方式?

謝謝

編輯。我試圖在這個控制器之前,我嘗試下面的代碼在視圖.cshtml和它的作品,但我更喜歡的代碼移動到一個控制器

@{ 
        System.Web.UI.WebControls.Calendar cal = new System.Web.UI.WebControls.Calendar(); 
        cal.ID = "MyCalendar"; 
        cal.CssClass = "month-view"; 
        cal.CellSpacing = 0; 
        cal.CellPadding = -1; 
        cal.BorderWidth = 0; 
        cal.ShowGridLines = false; 
        cal.ShowTitle = false; 
        cal.DayNameFormat = System.Web.UI.WebControls.DayNameFormat.Full; 
        cal.RenderControl(new HtmlTextWriter(Html.ViewContext.Writer)); 
       } 

編輯#2。我想在控制器中使用它的原因是,如果將來我想連接一個名爲「DayRender」的事件,我可以在控制器中完成。我不能在視圖中做同樣的事情而不會污染視圖頁面。

+3

這是不正確的。 'Html.Action'爲鏈接的HTML代碼生成一個鏈接,其URL與控制器中的操作方法相對應。它不用於製作自定義HTML字符串。如果你需要構建HTML,你可以在視圖本身中構建它。試圖在內存中渲染一些舊的Web控件並輸出呈現的HTML將會產生非常複雜和雜亂的代碼,並且可能根本不會最終工作。 – David

+0

大衛,我無法找到一個與Thread.CurrentThread.CurrentCulture開箱即用的日曆控件,例如我只想使用Calendar控件將正確的html輸出到頁面。 – Liming

+0

我不認爲在MVC中有任何使用Web窗體控件的方式,所以如果您絕對需要使用Web窗體控件,那麼您運氣不好。你也許可以構建自己的日曆。或者Google搜索「ASP.NET MVC日曆」會返回(預計)很多結果。 Telerik產品通常特別好。 – David

回答

1

好。多謝你們。我想通了。基本上,我需要使用@ {Html.RenderAction(..)}並在動作本身中使用StringBuilder/StringWriter,然後返回Content(...)。下面

代碼在瀏覽

@{Html.RenderAction("Calendar", "GlobalShared");} 

在控制器

[ChildActionOnly] 
     public ActionResult Calendar(
      ) 
     { 

      System.Web.UI.WebControls.Calendar cal = new System.Web.UI.WebControls.Calendar(); 
      cal.ID = "MyCalendar"; 
      cal.CssClass = "month-view"; 
      cal.CellSpacing = 0; 
      cal.CellPadding = -1; 
      cal.BorderWidth = 0; 
      cal.ShowGridLines = false; 
      cal.ShowTitle = false; 
      cal.DayNameFormat = System.Web.UI.WebControls.DayNameFormat.Full; 
      cal.DayRender += new System.Web.UI.WebControls.DayRenderEventHandler(CalendarDayRender); 
      StringBuilder sb = new StringBuilder(); 
      using (System.IO.StringWriter sw = new System.IO.StringWriter(sb)) 
      { 

       System.Web.UI.HtmlTextWriter writer = new System.Web.UI.HtmlTextWriter(sw); 
       cal.RenderControl(writer); 
      } 
      String calHTML = sb.ToString(); 
      return Content(calHTML); 
     } 

     private void CalendarDayRender(object sender, System.Web.UI.WebControls.DayRenderEventArgs e) 
     { 

      e.Cell.Text = ""; 
      if (e.Day.Date == System.DateTime.Today) 
      { 
       e.Cell.CssClass = "today"; 
       System.Web.UI.HtmlControls.HtmlGenericControl h3 = new System.Web.UI.HtmlControls.HtmlGenericControl("h3"); 
       h3.InnerHtml = HttpContext.GetGlobalResourceObject("JTG_DateTime", "JTK_Today") + " " + e.Day.DayNumberText; 
       e.Cell.Controls.Add(h3); 
      } 

     } 
0

只需將您的代碼

@{ 
        System.Web.UI.WebControls.Calendar cal = new System.Web.UI.WebControls.Calendar(); 
        cal.ID = "MyCalendar"; 
        cal.CssClass = "month-view"; 
        cal.CellSpacing = 0; 
        cal.CellPadding = -1; 
        cal.BorderWidth = 0; 
        cal.ShowGridLines = false; 
        cal.ShowTitle = false; 
        cal.DayNameFormat = System.Web.UI.WebControls.DayNameFormat.Full; 
        cal.RenderControl(new HtmlTextWriter(Html.ViewContext.Writer)); 
       } 

在視圖中,並從你的日曆操作返回查看。

public ActionResult Calendar(
       String ID, 
       String CssClass, 
       int CellSpacing, 
       int CellPadding, 
       String BorderWidth, 
       String ShowGridLines, 
       String ShowTitle, 
       String DayNameFormat 
     ) 
    { 
     return View("Calendar"); 
    } 

您可以創建一個視圖模型或使用ViewBag從日曆操作這些值傳送到新創建的視圖

+0

謝謝#UmairP。我想過這個。我想進入控制器的原因是,如果將來我想添加諸如「DayRender」之類的事件,我可以在控制器中執行此操作。通過在局部視圖中這樣做,我失去了這種能力 – Liming

+0

我不是說你應該做HTML.RenderPartial。您應該使用HTML.RenderAction並從您的應用程序所需的任何位置調用您的操作。 –