标签: asp.net-mvc-3

ASP.NET MVC中的异步操作是否使用.NET 4上的ThreadPool中的线程

在这个问题之后,在ASP.NET MVC中使用异步操作时,我感到很舒服.所以,我写了两篇博文:

我对ASP.NET MVC上的异步操作有太多的误解.

我总是听到这句话:如果操作异步运行,应用程序可以更好地扩展

我也听到了很多这样的句子:如果你有大量的流量,你可能最好不要异步执行查询 - 消耗2个额外的线程来为一个请求提供服务会使资源远离其他传入的请求.

我认为这两句话是不一致的.

我没有太多关于threadpool如何在ASP.NET上工作的信息,但我知道线程池的线程大小有限.所以,第二句话必须与这个问题有关.

我想知道ASP.NET MVC中的异步操作是否在.NET 4上使用ThreadPool中的线程?

例如,当我们实现AsyncController时,应用程序结构如何?如果我获得巨大的流量,实现AsyncController是一个好主意吗?

有没有人可以在我眼前取下这个黑色的窗帘并向我解释ASP.NET MVC 3(NET 4)上有关异步的处理?

编辑:

我已经阅读了下面这个文件近几百次,我理解主要的交易,但我仍然感到困惑,因为那里有太多不一致的评论.

在ASP.NET MVC中使用异步控制器

编辑:

让我们假设我有如下控制器动作(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)

.net c# asp.net-mvc asynchronous asp.net-mvc-3

157
推荐指数
4
解决办法
10万
查看次数

正确使用_viewstart.cshtml和部分Razor视图的方法?

我正在使用_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窗体视图引擎不同,部分视图的文件扩展名相同.)

我考虑的其他选项,但更糟糕的是:

  • 将所有部分视图放入公共文件夹,这样他们就可以共享一个共同的_viewstart.cshtml.这会破坏与其控制器位于同一文件夹中的视图约定.
  • 不使用部分视图.

这是Razor视图引擎团队仍在充实的东西,还是我错过了一个基本概念?

razor asp.net-mvc-3

155
推荐指数
1
解决办法
6万
查看次数

Razor中的动态匿名类型导致RuntimeBinderException

我收到以下错误:

'object'不包含'RatingName'的定义

当您查看匿名动态类型时,它显然具有RatingName.

错误的屏幕截图

我意识到我可以用元组做到这一点,但我想理解为什么会出现错误信息.

dynamic anonymous-types razor asp.net-mvc-3

155
推荐指数
5
解决办法
6万
查看次数

MVC 3:当通过ajax加载时,如何在没有布局页面的情况下呈现视图?

我正在学习渐进式增强功能,我对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)

c# asp.net-mvc master-pages razor asp.net-mvc-3

152
推荐指数
5
解决办法
15万
查看次数

在ASP.NET MVC的ajax中包含antiforgerytoken

我在使用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)

asp.net ajax asp.net-mvc csrf asp.net-mvc-3

152
推荐指数
6
解决办法
14万
查看次数

EF LINQ包含多个嵌套实体

好的,我有三层实体,具有以下层次结构:课程 - >模块 - >章节

这是最初的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)

关于包含第二实体的任何想法?

任何建议或信息都将受到高度赞赏.谢谢!

.net linq entity-framework asp.net-mvc-3 entity-framework-5

148
推荐指数
5
解决办法
16万
查看次数

如何使用 ?:if语句使用Razor和内联代码块

我正在使用新的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)

但是这里有两个问题:

  1. vote-up@{puzzle.UserVote ....不会将@符号视为代码块的开头
  2. @puzzle.UserVote == VoteType.Up查看第一部分@puzzle.UserVote,好像它应该呈现变量的值.

有谁知道如何解决这些问题?

asp.net syntax asp.net-mvc razor asp.net-mvc-3

147
推荐指数
4
解决办法
9万
查看次数

如何向Razor页面添加额外的命名空间而不是@using声明?

我需要使用某种魔法来获取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所有页面放在首位的情况下开始工作

razor asp.net-mvc-3

146
推荐指数
3
解决办法
5万
查看次数

asp.net MVC3上的自定义错误页面

我正在开发一个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)

error-handling asp.net-mvc-3

144
推荐指数
3
解决办法
6万
查看次数

StringLength vs MaxLength将ASP.NET MVC与Entity Framework EF Code First相关联

行为[MaxLength][StringLength]属性有什么区别?

据我所知(除了[MaxLength]可以验证数组的最大长度)这些是相同的,有点多余?

ef-code-first entity-framework-4.1 asp.net-mvc-3

144
推荐指数
6
解决办法
10万
查看次数