16
2014
02

ASP.NET MVC是否可以使用WebForms服务器控

可以,现在默认模板的ContentPlaceHolder和Content本身就是服务器控件。 

但是要注意:上述的服务器控件是“无状态”的,所以使用的话基本上不会破坏MVC的结构(当然也可以用其他试图引擎,完全抛弃这些runat=server当然更好)。但是如果你需要用一些比如asp:Button,asp:TextBox之类有状态的服务器控件,甚至使用PostBack的话,确实可以用,但是不应该使用。一来这么做会破坏MVC的结构,二来MVC的结构也会破坏PostBack机制的实现。


虽然在MVC中可以使用服务器控件,但是微软之所以提出MVC框架,是因为传统的.Net Web网站的冗余代码太多,导致了网站的响应速度很慢,尤其是大型的网站,而导致冗余代码的一个根本原因,也是最主要的原因是因为大量的使用了VS自带的服务器控件,所以微软提出了MVC框架,使前台页面的代码更加简介,增快系统的响应速度,但是MVC中还是可以使用服务器控件,因为有一种开发模式是Web和MVC的混开发模式,目的是希望综合两者的优点与一起,但是还是不适合开发大型的系统,如果你在MVC中使用了服务器控件就违背了ASP.Net MVC最初发布的初衷...所以很多人说最好不要用,这就是为什么了。


要使用服务器端控件, 我们就需要在后台代码中为控件绑定数据. ASP.NET MVC框架提供的添加一个View对象的方法已经不能创建后台代码, 也就是说已经摒弃了这种方式.但是我们仍然可以自己添加.

首先创建一个带有后台代码的(.cs文件),一般的Web Form页面(aspx页面),然后修改页面的继承关系, 改为继承自ViewPage:


public partial class ShowModelWithControl : System.Web.Mvc.ViewPage


 在页面上放置一个Repeater控件用来显示数据:

<body>

    <form id="form1" runat="server">

    <div>

        <asp:Repeater ID="rptView" runat="server">

            <ItemTemplate>

                <%# ((KeyValuePair<string, object>)Container.DataItem).Value  %><br />

            </ItemTemplate>

        </asp:Repeater>

    </div>

    </form>

</body>


在Page_Load方法中, 为Repeater绑定数据:

    public partial class ShowModelWithControl : System.Web.Mvc.ViewPage

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            rptView.DataSource = ViewData;

            rptView.DataBind();

        }

    }


在Controller中创建Action, 为ViewData赋值:

        /// <summary>

        /// Action示例:使用服务器控件输出ViewData

        /// </summary>

        /// <returns></returns>

        public ActionResult ShowModelWithControlDemo()

        {

            ViewData["k1"] = @"This";

            ViewData["k2"] = @"is";

            ViewData["k3"] = @"a";

            ViewData["k4"] = @"page";

            return View("ShowModelWithControl");

        }


注意: 虽然我们同样可以在ASP.NET MVC中使用服务器端控件, 但是在MVC中这并不是一个好的使用方式.建议不要使用.


« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。