asp.net-mvc – ASP.NET MVC和ViewState
|
现在我已经看到了一些这样的问题,但这并不完全是我想要的,所以对于所有尖叫的重复,我道歉:)。 我几乎没有触摸到ASP.NET MVC,但从我的理解,没有ViewState / ControlState …很好。所以我的问题是保留控制状态的替代方法是什么?我们是否回到旧版ASP,我们可以通过创建具有控件状态的隐藏表单输入来模拟ASP.NET ViewState / ControlState,或者使用MVC,我们只是假定AJAX始终保留所有状态客户端并使AJAX呼叫更新? 这个问题有一些答案,Maintaining viewstate in Asp.net mvc?,但不完全是我在寻找答案。 更新:感谢所有答案到目前为止。只是为了清除我不寻找什么和我正在寻找: 不寻找: >会话解决方案 我正在寻找: >如果数据没有反弹到控件,则只能在回发时保留状态的方法。使用仅在初始页面加载时绑定网格的场景,即仅在必要时重新绑定数据来考虑WebForms。正如我所说,我不是想模仿WebForms,只是想知道MVC提供什么机制。 解决方法该公约已经可用,没有跳过太多的箍。诀窍是根据您传递到视图的模型连接TextBox值。[AcceptVerbs(HttpVerbs.Get)]
public ActionResult CreatePost()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreatePost(FormCollection formCollection)
{
try
{
// do your logic here
// maybe u want to stop and return the form
return View(formCollection);
}
catch
{
// this will pass the collection back to the ViewEngine
return View(formCollection);
}
}
接下来会发生什么,ViewEngine将使用formCollection,并使用Html帮助器与您的视图中具有的ID名称/值匹配集合中的键。例如: <div id="content">
<% using (Html.BeginForm()) { %>
Enter the Post Title: <%= Html.TextBox("Title",Model["Title"],50) %><br />
Enter the Post Body: <%= Html.TextArea("Body",Model["Body"]) %><br />
<%= Html.SubmitButton() %>
<% } %>
</div>
注意文本框和textarea的标识和身体的ID?现在,注意我如何设置View的Model对象的值?由于您在FormCollection中传入(并且您应该将视图设置为使用FormCollection进行强类型化),所以现在可以访问它。或者,没有强烈的打字,你可以简单地使用ViewData [“标题”](我想)。 POOF你的神奇的ViewState。这个概念被称为配置约定。 现在,上面的代码是使用FormCollection的最简单,最原始的形式。当您开始使用ViewModels而不是FormCollection时,事情变得有趣。您可以开始添加自己对Models / ViewModels的验证,并让控制器自动弹出自定义验证错误。那是另一天的答案。 我建议使用PostFormViewModel而不是Post对象,而是使用他自己的。无论哪种方式,通过在action方法上要求一个对象,您现在可以得到可以调用的IsValid()方法。 [AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreatePost(Post post)
{
// errors should already be in the collection here
if (false == ModelState.IsValid())
return View(post);
try
{
// do your logic here
// maybe u want to stop and return the form
return View(post);
}
catch
{
// this will pass the collection back to the ViewEngine
return View(post);
}
}
您的强类型视图需要调整: <div id="content">
<% using (Html.BeginForm()) { %>
Enter the Post Title: <%= Html.TextBox("Title",Model.Title,Model.Body) %><br />
<%= Html.SubmitButton() %>
<% } %>
</div>
您可以进一步了解,并在视图中显示错误,直接来自您在控制器中设置的ModelState。 <div id="content">
<%= Html.ValidationSummary() %>
<% using (Html.BeginForm()) { %>
Enter the Post Title:
<%= Html.TextBox("Title",50) %>
<%= Html.ValidationMessage("Title") %><br />
Enter the Post Body:
<%= Html.TextArea("Body",Model.Body) %>
<%= Html.ValidationMessage("Body") %><br />
<%= Html.SubmitButton() %>
<% } %>
</div>
这种方法有趣的是,您将注意到我没有在视图中设置验证摘要,也没有设置单个验证消息。我喜欢练习DDD概念,这意味着我的验证消息(和摘要)在我的域中被控制,并以集合的形式被传递。然后,我循环访问他的集合(如果有任何错误),并将它们添加到当前的ModelState.AddErrors集合。当您返回View(post)时,其余的是自动的。 很多很多的惯例都出来了。我强烈推荐的几本书,更详细地介绍了这些模式: > Professional ASP.NET MVC 1.0 而按照这个顺序,第一个涵盖整个MVC框架的原始螺母和螺栓。后者涵盖了Microsoft官方关注以外的高级技术,还有几种外部工具可以让您的生活更轻松(Castle Windsor,Moq等)。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 当ModelState为InValid时调用的Ajax.BeginF
- asp.net-mvc-4 – 如何永久教Visual Studio检测我的调试信息
- ASP.Net MVC Cookies不会持续存在
- asp.net-mvc – ASP.NET MVC UpdateModel()方法如何工作?
- asp.net-mvc-3 – 如何传递Request.QueryString到Url.Actio
- asp.net – MVC的最佳实践..使用接口的ViewModel绑定示例
- 最佳实践:ASP.NET中的CSS或主题?
- asp.net-web-api – 如何创建角色并将用户添加到ASP.NET MV
- asp.net – IE8 Win7 Facebook Connect问题
- asp.net-mvc – ASP.NET MVC自定义成员资格提供程序Web.con
- asp.net-web-api – 为什么我的超级简单的ASP.NE
- asp.net-mvc – 使用ASP.NET MVC帮助器方法设置m
- asp.net – .Net的新文件?
- 在asp.net中使用Eval()是什么
- asp.net-web-api – 默认使用ASP.NET Web API返回
- asp.net-web-api – ExtensionlessUrlHandler和“
- asp.net – 与Entity Framework中的联结表有多对
- asp.net – 使用xml类型在SQL Server 2005中存储
- asp.net-core – RemoteIpAddress始终为null
- 什么是链接服务器的ASP.NET连接字符串格式?
