asp.net c#MVC:如何没有ViewState生活?
我正在考虑将WebForms转换为MVC:
在.net MVC中,什么概念使得ViewState不需要?
如果一个表单被发回iteself等(即回发)? page / usercontrol如何保持其状态?
人们为维护某种状态而采取什么样的手段而不诉诸会话状态?
当然,一个完全无国籍的环境是不存在的?
但当然可以。 事实上,networking是无国界的。 事实上,任何相反的想法都是畸变。
Web控件在MVC中消失了。 在服务器端没有事件触发。 这被两种不同的机制取代 – url和发布表单数据。 正确使用这些将取代您对ViewState的需求。
在传统的ASP.NET Web应用程序中,您可以在您的网页上放置一个可执行函数X的LinkButton。ASP.NET会将大量的ViewState cruft,javascript和其他内容粘贴到网页中,以便当用户单击button时和“回发”到网站(通过提交一个没有人知道存在的表单),ASP.NET重build发生的事情,并确定一个特定的button事件处理程序必须执行。
在MVC中,您构build了访问特定路线的链接。 路由描述用户希望做什么 – / Users / Delinquent / Index(显示所有违规用户的列表)。 MVC中的路由系统确定哪个控制器将处理这个路由以及该控制器上的哪个方法将执行。 任何附加信息都可以通过URL查询string值(第5页的违规行为?页面= 5)传送给控制器方法。
除了URL之外,还可以使用HTML表单将POST更复杂的信息(例如表单的数据值)或不适合查询string(如文件)的内容回写。
所以你通过查询string“维护”状态并形成POST值。 你会发现,事实上,最后没有太多的状态要维护。 事实上,保持大量的状态很好地表明了你的devise缺乏,或者你正在尝试做一些不适合网站模型的事情。
一些相关的问题:
- 在Asp.net mvc中维护viewstate?
- ASP.NET MVC不适用于ViewState和Postback?
在大多数传统的networking语言中,有状态环境的概念实际上并不常见。 ASP.NET Webforms是规则的一个例外,它通过重新创build许多标准来创build这个exception。 Webforms背后的目标主要是抽象出HTML和Web开发的概念,以便从开发的angular度来看,桌面应用程序和Web应用程序之间的界限模糊不清。 这通常意味着ASP.NET Webforms所提供的解决scheme虽然有效,却是一种千斤顶式的交易实现,它会产生一些非常详细的输出,足以满足大多数人的需求。 相反,ASP.NET MVC的核心优势在于它将HTML输出控制权交给了开发人员,并允许他们创build强大架构的, REST风格的 Web应用程序,这些Web应用程序在实现和呈现方面有更好的定义和更清晰的performance – 尽pipe牺牲了某些级别的方便。
可以说Webform模型的最大缺点之一就是ViewState,因为它在一定的情况下会混乱输出,大大增加页面大小,而且通常相当于使用电钻来挂图片。 而不是试图在你的MVC应用程序(或类似的东西)中使用ViewState,你应该开始使用模式,明确地控制表单中的字段,并优化您的input和输出操作,只有最相关的数据。 除了标记的变化之外,您还将学习如何构build更好的devise解决scheme,以便在您的应用程序和外部应用程序中展示。
我想做的第一个比较就是:Webforms构buildWeb页面,但MVC构buildWeb应用程序。 如果您的日常工作主要是构build网站的一部分,或者添加小块function,那么您通常会发现Webform更容易,更省时; 另一方面,如果你想构build一个可testing,可伸缩和灵活的完整应用程序,那么MVC就是你的调用。
viewstate只是一个大的,丑陋的隐藏表单字段。
写出你自己隐藏的表单字段,并encryption它们,如果你必须。
幸运的是,不再有任何简单的方法将大量的数据转储到页面中,因此您必须对要保存的内容进行审慎。
如果一个表格被张贴回自己等(即回发)? page / usercontrol如何保持其状态? 人们为维护某种状态而采取什么样的手段而不诉诸会话状态?
发布的ViewData(或绑定到页面的强types对象)可以再次推送到视图。 请参阅本页中的 “将validation和业务规则逻辑与模型类集成” 。 它显示了如何发布表单,validation表单,并在发生错误时将表单返回给表单。
在.net MVC中,什么概念使得ViewState不需要?
具象状态传输(REST)。
MVC比WebForms有一些优势,但它也有一些缺点,我也覆盖了这个答案的细节。 我认为你必须问自己的一个根本问题是,ViewState是否对你来说是一个问题 – 是否你必须重写你的应用程序是一个这样的问题? 如果没有,那么学习MVC是一个有价值的目标(它确实很酷),但不是我冒这个险的商业目标。
据说,ViewState实际上可以在令人惊讶的大量情况下被禁用。 它主要用于通过后期持续控制的价值。 所以,例如,如果你有一个文本框的值,你必须检查服务器端以及一堆其他字段,ViewState会让你处理回传,捕捉错误(并显示一个标签),然后将用户返回到所有条目完整的表单。 但是,如果只填写表单并将其重新发布,然后redirect到其他页面,则可以安全地将其禁用。
最后,你问什么人在做什么,以避免会话状态。 有没有理由避免会话状态? 当然,你不需要太多的信息,但完全避免它是真的没有必要,事实上,将花费你的武器库中最强大的工具之一。
所有的答案说ASP.NET MVC不使用状态是非常正确的。 但是ASP.NET MVC确实使用了一些状态,尽pipe它不能像ViewState一样工作。
通常,当某人将数据发布到应用程序时,如果数据无效,您将需要validation数据并显示错误。 但是,如果您立即返回包含错误消息的页面,当用户点击F5重新加载页面时,数据将被重新提交。 这通常不是你想要的。 因此,当你意识到POST数据无效时,你想告诉用户GET页面(或者另一个页面)并显示错误信息。 你通过返回一个HTTPredirect状态码来做到这一点。 但是,一旦用户的GET请求进来,你怎么知道要显示什么错误信息? 你必须记得从你(服务器)处理POST开始直到你正在处理GET为止。
为此,您可以使用名为TempData的ASP.NET MVCfunction。 这实际上只是Session的一个包装,它确保无论你插入到TempData字典中的什么东西都会留在那里,直到下一个请求不再。
考虑一下这样一个事实,即networking编程中的REST运动是基于状态对程序不好的想法。 维基百科有一个体面的描述与参考: http : //en.wikipedia.org/wiki/Representational_State_Transfer
从传统的ASP.NET和它提供的丰富的事件模型来看,MVC可能会相当震撼。 它确实需要pipe理一些以前看不见的东西,但是我认为在可testing性方面的价值(REST页面可以很容易地触发,而不需要创build一个复杂的视图状态,根据定义,服务器没有保持状态,所以我可以testing页面/function)隔离学习曲线。
有关ASP.NET和REST中的MVC的一些讨论: http : //blog.wekeroad.com/2007/12/06/aspnet-mvc-using-restful-architecture/
状态是数据库中的模型。 您可以小心地caching数据库以减less页面加载时间。
自动生成的视图状态在MVC中不存在,但你可以简单地使用隐藏的字段来编写自己的视图状态,
在MVC中,您不会在页面顶部看到大量encryption的字符,而这些字符并不是您最需要的。
其实它确实。 你必须忘记视图状态的持久性。
你也必须把你的想法转换回页面,以“打电话给控制器”。 这样以后事情会更容易理解。 不是调用页面,而是调用返回视图的控制器。 因此,无论是在每一次电话会议上,你都会一遍又一遍地build立你的整个“页面”,或者你决定只处理真正受到影响的事物。 如果button正在更改div,为什么要重新加载整个页面。 只要让你打电话给你的控制器,并返回你的div应该是新的数据。
例如让我们想象一下主/细节场景:
<h2>Groups</h2> <div id="GroupList"> </div> <div id="GroupDetail" title="Detail Group"> </div>
组的列表在div中加载一次,并且对于组列表中的每个项目,控制器都可以使用ajax调用:
<%= Ajax.ActionLink("Edit", "DetailLocalisationGroup", new { id = group.Id }, new AjaxOptions() { UpdateTargetId = "DetailLocalisationGroup", OnSuccess = "InitialisationDetailGroup" })%>
它调用这个动作DetailLocalisationGroup这是饲料div的GroupDetail与HTML。
[AcceptVerbs("POST")] public ActionResult DetailLocalisationGroup(int id) { LocalisationGroup group = servicelocalisation.GetLocalisationGroup(id); return View("DetailGroup", group); }
现在div中有一个表单,当按下这个表单的提交button时,我们只是把我们真正需要的信息发送给一个控制器,然后这个控制器将数据保存到数据库中。
在所有这些事件中,GroupList充满了在客户端屏幕上显示的内容,但是在那里不需要任何交互,所以为什么还要为这些视图打扰自己…
您可以使用MVC3Futures项目模仿视图状态。 它将保存整个模型。
所有你需要做的就是序列化模型并在视图中进行encryption。
@Html.Serialize("Transfer", Model, SerializationMode.EncryptedAndSigned)
并在控制器中添加反序列化的属性。
public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer)
阅读所有这些post后,听起来像MVC是不适合LOBtypes的应用程序,在那里你会有很多的控制和CRUD操作,你想保持控件的状态。 提交操作完成后,您希望用户保持相同视图和维护状态的原因很多。 例如显示错误,服务器端validation消息,成功消息或执行任何其他操作。 将用户redirect到其他视图来显示这些消息是不实际的。
您可以在会话状态中存储任何对象。
HttpContext.Session["userType"] = CurrentUser.GetUserType();