小编elo*_*los的帖子

将复杂对象存储在TempData中

我一直试图通过使用TempData重定向后将数据传递给一个动作,如下所示:

if (!ModelState.IsValid)
{
    TempData["ErrorMessages"] = ModelState;
    return RedirectToAction("Product", "ProductDetails", new { code = model.ProductCode });
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它失败了以下消息:

" System.InvalidOperationExceptionMicrosoft.AspNet.Mvc.SessionStateTempDataProvider'不能序列类型的对象'ModelStateDictionary'到会话状态".

在Github的MVC项目中发现了一个问题,但是虽然它解释了为什么我收到这个错误,但我看不出什么是可行的替代方案.

一种选择是将对象序列化为json字符串,然后将其反序列化并重新构建ModelState.这是最好的方法吗?我需要考虑哪些潜在的性能问题?

最后,是否有任何替代方法可以序列化复杂对象或使用其他不涉及使用的模式TempData

c# tempdata asp.net-core-mvc asp.net-core

52
推荐指数
3
解决办法
2万
查看次数

类型或命名空间名称"Mvc"不存在

我最近安装了visual studio 2013.从网上下载了一个示例项目后,我运行它时,它给了我以下错误 -

The type or namespace name 'Mvc' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)  
Run Code Online (Sandbox Code Playgroud)

如何克服这个错误?

asp.net-mvc visual-studio-2013

48
推荐指数
2
解决办法
7万
查看次数

创建和下载zip存档为HttpContent时的内存使用情况

我有一个web api GET方法,它返回一个zip文件供下载.这是创建zip存档的代码:

var resultStream = new MemoryStream();    
using (var zipArchive = new ZipArchive(resultStream, ZipArchiveMode.Create, leaveOpen: true))
{
    foreach (var file in files)
    {
        zipArchive.CreateEntryFromFile(file.Path, file.Name, CompressionLevel.Optimal);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是响应如何填充:

var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new ByteArrayContent(resultStream.ToArray());
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = "export_" + DateTime.Now.ToString("dd-MM-yyyy_HH-mm-ss") + ".zip";
response.Content.Headers.ContentDisposition.CreationDate = DateTime.Now;
response.Content.Headers.ContentDisposition.Size = resultStream.Length;
response.Content.Headers.ContentLength = resultStream.Length;
Run Code Online (Sandbox Code Playgroud)

上面的代码运行得很好,问题是它在服务器上消耗了大量内存,当然这取决于文件大小.我已经尝试将结果更改为StreamContent,但这不起作用,因为响应只返回标题并最终超时.

所以这是我的问题:

  1. 有没有办法避免在内存中加载所有文件,而是在创建时发送zip文件?
  2. 是否更好地使用StreamContent在这种情况下使用,如果是,我需要更改什么才能使其工作?
  3. 缓冲如何影响每种情况下的内存消耗?我已经尝试通过实现本文中IHostBufferPolicySelector建议的自定义来禁用缓冲,但它似乎没有任何效果.
  4. 目前可以通过使用HttpClient或AJAX请求导航链接来调用api操作,因此任何解决方案都必须支持所有方案.

c# asp.net-web-api

9
推荐指数
1
解决办法
1121
查看次数

MVC脚手架不支持Entity Framework 6

我正在尝试使用Entity Framework添加具有读/写操作和视图的控制器.

但是当我这样做时,VS2012告诉我"MVC脚手架不支持实体框架6或更高版本".我已阅读http://support.microsoft.com/kb/2816241并尝试卸载EntityFramework 6并在Nuget Manager Console中安装5:

PM> Uninstall-package EntityFramework -force从OnlinebookingAdministrator中删除'EntityFramework 6.0.2'.已成功从OnlinebookingAdministrator中删除了"EntityFramework 6.0.2".卸载'EntityFramework 6.0.2'.已成功卸载'EntityFramework 6.0.2'.

PM> Install-Package EntityFramework -version 5.0.0'EntityFramework 5.0.0'已经安装.将"EntityFramework 5.0.0"添加到OnlinebookingAdministrator.成功将"EntityFramework 5.0.0"添加到OnlinebookingAdministrator.

但是当我尝试添加控制器时,错误不断出现.这个问题有方法解决吗?

asp.net-mvc entity-framework-6

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

在循环中处理多个异常

在我的代码中,一个方法在循环中被重复调用,如下所示:

foreach (var file in files)
{
    SomeMethod(file);
}
Run Code Online (Sandbox Code Playgroud)

该方法可能会抛出异常,但我不希望代码在第一个异常后退出循环.

此外,上面的代码是从web api控制器调用的,所以我需要一种方法将所有异常信息传递回控制器,在那里它将被处理(记录异常并向客户端返回错误响应).

到目前为止我所做的是捕获并将所有异常存储在列表中.

var errors = new List<Exception>();

foreach (var file in files)
{
    try
    {
        SomeMethod(file);
    }
    catch(Exception ex)
    {
        errors.Add(ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

考虑到重新抛出列表中的所有错误不是一种选择,将异常信息返回给控制器的最佳方法是什么?

c# exception-handling exception

5
推荐指数
1
解决办法
704
查看次数

使用MVC6标签帮助器的带有用于枚举的单独标签的单选按钮

我的模型包含一个我试图绑定到单选按钮列表的枚举,以便在提交表单时只能选择一个值。

public enum Options
{
    [Display(Name="Option A")
    OptionA,
    [Display(Name="Option B")
    OptionB
}

public class MyModel
{
     public Options SelectedOption {get; set;}
     public string TextA{get; set;}
     public string TextB{get; set;}
}
Run Code Online (Sandbox Code Playgroud)

在MVC 5中,我将为每个枚举值呈现一个单选按钮输入,并且用户将只能选择一个。因此,视图中每个单选按钮的代码可能如下所示:

@Html.RadioButtonFor(m => m.SelectedOption, Options.OptionA)
Run Code Online (Sandbox Code Playgroud)

MVC6的问题似乎是输入标签帮助程序不支持现成的枚举属性。因此,如果我尝试添加<input asp-for="SelectedOption"/>,我得到的只是一个文本框。

所以我的问题是,有没有办法使用MVC6标签帮助程序(即开即用或自定义)来完成此操作,还是有另一种方法来执行此操作?也许像使用旧的剃刀语法或仅添加输入标签并填充其属性之类的东西?

请注意,理想情况下,两个单选按钮都必须有标签,以显示枚举[Display]属性中指定的文本。另外,TextATextB文本框只能同时出现,这应该基于所选的单选按钮,但这不在问题的范围内。因此,这就是渲染标记的外观(或多或少):

<div>
    <div>
        <input id="OptionA" type="radio" name="SelectedOption"/>
        <label for="OptionA">Option A</label>
    </div>
    <div>
        <label for="TextA">Text A</label>
        <input type="text" id="TextA" name="TextA">
    </div>
<div>

<div>
<div>
    <input id="OptionB" type="radio" name="SelectedOption"/>
    <label for="OptionB">Option B</label>
</div>

    <div>
        <label …
Run Code Online (Sandbox Code Playgroud)

enums radio-button asp.net-core-mvc tag-helpers

5
推荐指数
1
解决办法
2057
查看次数

如果C#中的对象参数为null,我该如何创建自己的异常?

我使用以下代码:

public static string ToJSONString(this object obj)
{
    using (var stream = new MemoryStream())
    {
        var ser = new DataContractJsonSerializer(obj.GetType());

        ser.WriteObject(stream, obj);

        return Encoding.UTF8.GetString(stream.ToArray());
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当对象为null时,我得到以下内容:

System.NullReferenceException未由用户代码处理HResult = -2147467261 Message =对象引用未设置为对象的实例.

有没有办法可以捕获此异常并将其返回给调用程序.现在它给了我上面的错误,Visual Studio停了下来.

c# exception-handling

2
推荐指数
1
解决办法
96
查看次数

如何限制循环在C#中的数量

我的代码在新行上每次"购买"时添加总和,但我只希望他们能够完成5个条目.将此代码复制并粘贴到visual studio中作为控制台应用程序,然后调试或运行它或其他任何东西.我是C#的新手,想知道如何只允许5个数字.我试图不要偏离我下面的代码太远.话虽如此,可能有更先进的方法来做到这一点,但我不希望这样.

namespace SumFiveDoubles
{
    class TotalPurchase
    {
        static void Main()
        {
            double purchase;
            double total = 0;
            string inputString;
            const double QUIT = 0;
            Console.Write("Enter a purchase amount >> ");
            inputString = Console.ReadLine();
            purchase = Convert.ToDouble(inputString);
            while (purchase != QUIT)
            {
                total += purchase;
                Console.Write("Enter another purchase amount or " + QUIT + " to calculate >> "); //I only want this to appear 4 more times\\
                inputString = Console.ReadLine();
                purchase = Convert.ToDouble(inputString);
            }
            Console.WriteLine("Your total is {0}", total.ToString("C")); …
Run Code Online (Sandbox Code Playgroud)

c# visual-studio

1
推荐指数
1
解决办法
2089
查看次数