【发布时间】:2011-09-15 18:35:44
【问题描述】:
我知道我知道,这不合常理。在大家想讲MVC模式之前,这是一个极端的措施。我有一个 ASP.NET 控件,我必须在需要 ViewState 的 MVC 中工作,并且希望能够专注于这一点。我知道我可以load a classic ASP.NET pages in MVC by a trick of routes,但我需要一个适合 MVC 框架的整体解决方案。
必须有一种方法来扩展 ViewUserControl 以与 ViewState 游戏一起玩,或者通过过滤器或属性,甚至通过解析请求并以某种方式覆盖管道早期的某些内容以调用 LoadViewState 来模拟 ViewState 对象。
唉,恐怕我对经典的 ASP.NET 不够精通,不知道如何做到这一点。 ViewUserControl 具有派生自 UserControl 对象的 ViewState 属性以及 SaveViewState 和 LoadViewState 方法,因此我看到了这样做的一些希望。
这是我目前所拥有的:
<%@ Control Language="C#" CodeBehind="RadGridExample.ascx.cs" Inherits="MvcApplication5.Views.Shared.RadGridExample" %>
<form runat="server">
<telerik:RadScriptManager ID="scriptmanager2" runat="server"></telerik:RadScriptManager>
<telerik:RadGrid runat="server" ID="RadGrid1" AutoGenerateColumns="false" AllowMultiRowSelection="true" ShowGroupPanel="true">
<MasterTableView TableLayout="Fixed" >
<Columns>
<telerik:GridBoundColumn DataField="Name" HeaderText="Name" DataType="System.String" />
<telerik:GridBoundColumn DataField="Age" HeaderText="Age" DataType="System.String" />
</Columns>
</MasterTableView>
<ClientSettings AllowDragToGroup="true" >
</ClientSettings>
</telerik:RadGrid>
</form>
局部视图背后的代码:
namespace MvcApplication5.Views.Shared
{
public class RadGridExample : ViewUserControl
{
protected void Page_Init()
{
HomeIndexViewModel viewModel = this.Model as HomeIndexViewModel;
RadGrid grid = this.Controls[0].FindControl("RadGrid1") as RadGrid;
grid.DataSource = viewModel.Animals;
grid.DataBind();
}
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
}
protected override object SaveViewState()
{
return base.SaveViewState();
}
}
}
有趣的是,SaveViewState 被调用,但 LoadViewState 从来没有。
【问题讨论】:
-
所以我假设既然您可以在 MVC 项目中拥有一个 Web 表单页面,那么您就不能为这个控件恢复到 Web 表单方法吗?另外,这是一个 ASP.NET 自定义控件,它是您自己的还是第三方供应商?
-
嘿@Brian,是的,不。对这个控件使用经典的 asp.net 模式(如此处所述:weblogs.asp.net/rajbk/archive/2010/05/11/…)是我最后的手段。问题是它是具有安全属性和模型吊索的广泛 MVC 应用程序的一部分。为了使 asp.net 页面与安全性和传入模型相提并论,这将导致大量的改造。尽管我们可以扩展 MVC,但我拒绝相信从填充的请求中破解 ViewState 并让 MVC 与它一起使用是不可能的。
-
这是一个三十方控制,Telerik 的 RadGrid。我可以访问源代码,并按照一系列步骤一直回到简单的实现,即永远不会调用控件的 LoadViewState。
标签: c# asp.net-mvc asp.net-mvc-3