我知道我知道,它違背了穀物。在每個人都想講述MVC模式之前,這是一個極端的措施。我有一個ASP.NET控件,我必須在MVC中工作,這需要ViewState,並且非常感謝關注這一點。我知道我可以load a classic ASP.NET pages in MVC by a trick of routes,但我需要一個適合MVC框架的整體解決方案。在MVC中支持ViewState ViewUserControl
必須有一種方法來擴展ViewUserControl以與ViewState遊戲,過濾器或屬性一起玩,甚至通過解析請求來模擬ViewState對象,並以某種方式在管道的早期重寫某些內容以調用LoadViewState 。
唉,恐怕我對經典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自定義控件,它是你自己還是第三方供應商? –
嘿@布萊恩,是的沒有。對這一個控件使用經典的asp.net模式(如下所述:http://weblogs.asp.net/rajbk/archive/2010/05/11/running-asp-net-webforms-and-asp-net-mvc -side-by-side.aspx)是我的最後一招。問題是它是一個廣泛的MVC應用程序的一部分,具有安全屬性和模型吊銷。這將導致大量的改造,以獲得與安全性和傳入模型相當的asp.net頁面。儘管我們可以擴展MVC,但我拒絕相信從填充的Request中篡改ViewState並獲得MVC與它一起玩是不可能的。 – Levitikon
這是一個三十方控制,Telerik的RadGrid。我可以訪問源代碼,並且一直追溯到簡單的實現Control的LoadViewState從未被調用的步驟。 – Levitikon