在这个问题之后,在ASP.NET MVC中使用异步操作时,我感到很舒服.所以,我写了两篇博文:
我对ASP.NET MVC上的异步操作有太多的误解.
我总是听到这句话:如果操作异步运行,应用程序可以更好地扩展
我也听到了很多这样的句子:如果你有大量的流量,你可能最好不要异步执行查询 - 消耗2个额外的线程来为一个请求提供服务会使资源远离其他传入的请求.
我认为这两句话是不一致的.
我没有太多关于threadpool如何在ASP.NET上工作的信息,但我知道线程池的线程大小有限.所以,第二句话必须与这个问题有关.
我想知道ASP.NET MVC中的异步操作是否在.NET 4上使用ThreadPool中的线程?
例如,当我们实现AsyncController时,应用程序结构如何?如果我获得巨大的流量,实现AsyncController是一个好主意吗?
有没有人可以在我眼前取下这个黑色的窗帘并向我解释ASP.NET MVC 3(NET 4)上有关异步的处理?
编辑:
我已经阅读了下面这个文件近几百次,我理解主要的交易,但我仍然感到困惑,因为那里有太多不一致的评论.
编辑:
让我们假设我有如下控制器动作(AsyncController虽然不是实现):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Run Code Online (Sandbox Code Playgroud)
正如你在这里看到的那样,我开始操作并忘掉它.然后,我立即返回而不等待它完成.
在这种情况下,这是否必须使用来自线程池的线程?如果是这样,在完成之后,该线程会发生什么?GC完成后会进来清理吗?
编辑:
对于@ Darin的回答,这里是一个与数据库对话的异步代码示例:
public class FooController : AsyncController {
//EF 4.2 DbContext instance
MyContext _context = new MyContext();
public void IndexAsync() { …Run Code Online (Sandbox Code Playgroud) 我正在使用_viewstart.cshtml自动为我的视图分配相同的Razor布局.
它是我的Views文件夹根目录中的一个死的简单文件,如下所示:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)
这比将@Layout指令添加到每个视图更干.
但是,这对Razor 局部视图造成了问题,因为它们运行_viewstart.cshtml的内容,因此错误地为自己分配了一个布局,这使得它们不再是局部的.
这是一个假设项目,显示_viewstart.cshtml文件,共享_layout.shtml文件和部分视图("AnonBar.cshtml").
目前,我解决这个问题的方法是在每个局部视图中添加以下行:
@{
Layout = "";
}
Run Code Online (Sandbox Code Playgroud)
这似乎是在Razor中将视图表示为部分视图的错误方式.(请注意,与Web窗体视图引擎不同,部分视图的文件扩展名相同.)
我考虑的其他选项,但更糟糕的是:
这是Razor视图引擎团队仍在充实的东西,还是我错过了一个基本概念?
我收到以下错误:
'object'不包含'RatingName'的定义
当您查看匿名动态类型时,它显然具有RatingName.

我意识到我可以用元组做到这一点,但我想理解为什么会出现错误信息.
我正在学习渐进式增强功能,我对AJAXifying视图有疑问.在我的MVC 3项目中,我有一个布局页面,一个viewstart页面和两个普通视图.
viewstart页面位于Views文件夹的根目录中,因此适用于所有视图.它指定所有视图都应该_Layout.cshtml用于其布局页面.布局页面包含两个导航链接,每个视图一个.链接用于@Html.ActionLink()将自己呈现给页面.
现在我添加了jQuery并希望劫持这些链接并使用Ajax动态加载页面上的内容.
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
Run Code Online (Sandbox Code Playgroud)
我可以通过两种方式来做到这一点,但我并不特别喜欢这两种方式:
1)我可以获取整个View的内容并将它们放在局部视图中,然后让主视图在渲染时调用局部视图.这样,Request.IsAjaxRequest()在控制器中使用,我可以根据请求是否是Ajax请求返回View()或返回PartialView().我无法将常规视图返回到Ajax请求,因为它将使用布局页面,我将获得注入的布局页面的第二个副本.但是,我不喜欢这个,因为它迫使我创建空视图,其中只有一个@{Html.RenderPartial();}用于标准GET请求.
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Run Code Online (Sandbox Code Playgroud)
然后在Index.cshtml中执行以下操作:
@{Html.RenderPartial("partialView");}
Run Code Online (Sandbox Code Playgroud)
2)我可以从_viewstart中删除布局指定,并在请求不是Ajax时手动指定它:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return …Run Code Online (Sandbox Code Playgroud) 我在使用ajax的AntiForgeryToken遇到了麻烦.我正在使用ASP.NET MVC 3.我在jQuery Ajax调用和Html.AntiForgeryToken()中尝试了解决方案.使用该解决方案,现在正在传递令牌:
var data = { ... } // with token, key is '__RequestVerificationToken'
$.ajax({
type: "POST",
data: data,
datatype: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
url: myURL,
success: function (response) {
...
},
error: function (response) {
...
}
});
Run Code Online (Sandbox Code Playgroud)
当我删除[ValidateAntiForgeryToken]属性只是为了查看数据(带有令牌)是否作为参数传递给控制器时,我可以看到它们正在被传递.但由于某种原因,A required anti-forgery token was not supplied or was invalid.当我放回属性时,消息仍会弹出.
有任何想法吗?
编辑
antiforgerytoken是在表单中生成的,但我没有使用提交操作来提交它.相反,我只是使用jquery获取令牌的值,然后尝试ajax发布.
这是包含令牌的表单,位于顶部母版页:
<form id="__AjaxAntiForgeryForm" action="#" method="post">
@Html.AntiForgeryToken()
</form>
Run Code Online (Sandbox Code Playgroud) 好的,我有三层实体,具有以下层次结构:课程 - >模块 - >章节
这是最初的EF LINQ声明:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters))
.Single(x => x.Id == id);
Run Code Online (Sandbox Code Playgroud)
现在,我想要包含另一个名为Lab的实体,该实体与课程相关联.
如何包含实验室实体?
我尝试了以下但它不起作用:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
.Single(x => x.Id == id);
Run Code Online (Sandbox Code Playgroud)
关于包含第二实体的任何想法?
任何建议或信息都将受到高度赞赏.谢谢!
我正在使用新的Razore视图引擎更新旧的.aspx视图.我有很多地方,我有这样的代码:
<span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span>
Run Code Online (Sandbox Code Playgroud)
理想情况下我想这样做:
<span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}">Vote Up</span>
Run Code Online (Sandbox Code Playgroud)
但是这里有两个问题:
vote-up@{puzzle.UserVote ....不会将@符号视为代码块的开头@puzzle.UserVote == VoteType.Up查看第一部分@puzzle.UserVote,好像它应该呈现变量的值.有谁知道如何解决这些问题?
我需要使用某种魔法来获取pages/namespaceswebconfig中元素的名称空间吗?
<pages>
<namespaces>
<add namespace="System.Web.Mvc"/>
<add namespace="System.Web.Mvc.Ajax"/>
<add namespace="System.Web.Mvc.Html"/>
<add namespace="System.Web.Routing"/>
<add namespace="System.Web.WebPages"/>
<add namespace="System.Web.Helpers"/>
<add namespace="MyCustomHelpers"/>
</namespaces>
</pages>
Run Code Online (Sandbox Code Playgroud)
以上只是不想要的工作.我知道命名空间很好,因为当我把它@using MyCustomHelpers放在页面的顶部时它神奇地起作用.
这样我就可以在Html.SomeFunction()不必将@using所有页面放在首位的情况下开始工作
我正在开发一个MVC3基础网站,我正在寻找一个处理错误的解决方案,并为每种错误渲染自定义视图.因此,假设我有一个"错误"控制器,其主要操作是"索引"(通用错误页面),并且此控制器将针对用户可能出现的错误(如"Handle500"或"HandleActionNotFound")执行更多操作.
因此,网站上可能发生的每个错误都可能由此"错误"控制器处理(例如:"Controller"或"Action"未找到,500,404,dbException等).
我使用Sitemap文件来定义网站路径(而不是路由).
这个问题已经回答了,这是对Gweebz的回复
我的最终applicaiton_error方法如下:
protected void Application_Error() {
//while my project is running in debug mode
if (HttpContext.Current.IsDebuggingEnabled && WebConfigurationManager.AppSettings["EnableCustomErrorPage"].Equals("false"))
{
Log.Logger.Error("unhandled exception: ", Server.GetLastError());
}
else
{
try
{
var exception = Server.GetLastError();
Log.Logger.Error("unhandled exception: ", exception);
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Errors";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
IController errorsController = new ErrorsController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
catch (Exception e)
{
//if Error controller failed for same reason, …Run Code Online (Sandbox Code Playgroud) 行为[MaxLength]和[StringLength]属性有什么区别?
据我所知(除了[MaxLength]可以验证数组的最大长度)这些是相同的,有点多余?
asp.net-mvc-3 ×10
razor ×5
asp.net-mvc ×4
.net ×2
asp.net ×2
c# ×2
ajax ×1
asynchronous ×1
csrf ×1
dynamic ×1
linq ×1
master-pages ×1
syntax ×1