0

我试着研究了一下,但还没有找到合适的解决方案。

我想要做的是在这样的页面中有一个 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”,我可以在控制器中完成它。在不污染视图页面的情况下,我不能在视图中做同样的事情。

4

2 回答 2

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);
            }

        }
于 2013-06-18T16:56:55.323 回答
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");
    }

您可以创建 ViewModel 或使用 ViewBag 将这些值从 Calendar Action 传输到新创建的 View

于 2013-06-18T16:37:25.137 回答