Asp.net mvc 4 Razor MVC返回HTML

Asp.net mvc 4 Razor MVC返回HTML,asp.net-mvc-4,razor,Asp.net Mvc 4,Razor,我试着研究了一下,但没有找到一个合适的解决办法 我想做的是在这样一个页面中有一个HTML.Action Html.Action("Calendar", "GlobalShared") 在动作“Calendar”中,我需要返回传统Calendar控件的html结果 public ActionResult Calendar( String ID, String CssClass, int

我试着研究了一下,但没有找到一个合适的解决办法

我想做的是在这样一个页面中有一个HTML.Action

Html.Action("Calendar", "GlobalShared")
在动作“Calendar”中,我需要返回传统Calendar控件的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字符串,这是正确的还是我应该用其他方法

谢谢

编辑。在控制器中尝试此操作之前,我在view.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”,我可以在控制器中执行。在视图中,如果不污染视图页面,我无法执行相同的操作

只需移动代码即可

@{
                    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将这些值从日历操作转移到新创建的视图中。好的。谢谢各位。我明白了。基本上,我需要使用@{Html.RenderAction(…)},在动作本身中,使用StringBuilder/StringWriter,然后返回内容(…)。代码如下

鉴于

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

        }

这是不对的
Html.Action
为其URL对应于控制器中操作方法的链接生成Html代码。它不用于创建自定义HTML字符串。如果需要构建HTML,可以在视图本身中构建它。试图在内存中呈现一些旧的web控件并输出呈现的HTML将创建非常复杂和混乱的代码,并且最终可能根本无法工作。David,我找不到一个日历控件可以在Thread.CurrentThread.CurrentCulture中开箱即用,因此,我只想使用Calendar控件将正确的html输出到页面。我认为MVC中没有任何使用Web窗体控件的方法,因此,如果您绝对需要使用Web窗体控件,那么您就不走运了。你也许可以构建自己的日历。或者谷歌搜索“ASP.NETMVC日历”会(预期)返回许多结果。“Telerik提供的产品通常特别好。@David。请看我的编辑上面。我可以在view.cshtml中执行此操作,它工作正常。现在我只想把它移到一个控制器中。jqgrid有你需要的。谢谢#UmairP。我想了想。我想进入控制器的原因是,如果将来我想添加“DayRender”之类的事件,我可以在控制器中执行。在局部视图中这样做,我失去了这种能力,我不是说你应该做HTML.RenderPartial。您应该使用HTML.RenderAction并在应用程序中需要的任何位置调用您的操作。