C# C/ASP.NET Web应用程序MVC提交文件并从中读取文本

C# C/ASP.NET Web应用程序MVC提交文件并从中读取文本,c#,asp.net-mvc-5,C#,Asp.net Mvc 5,我一直在做这件事,在网上搜索得很彻底,我遇到的任何解决方案似乎都不符合我的需要,也不符合我的工作方式 我正在使用Visual Studio 2013。我创建了一个ASP.NET Web应用程序,并创建了多个练习,这些练习使用ExerciseController连接到该应用程序。我需要做的最后几个需要上传的文件。我使用我的现有表单执行此操作,如下所示: <form action="@Url.Action("CountWord", "Exercises")" method="post">

我一直在做这件事,在网上搜索得很彻底,我遇到的任何解决方案似乎都不符合我的需要,也不符合我的工作方式

我正在使用Visual Studio 2013。我创建了一个ASP.NET Web应用程序,并创建了多个练习,这些练习使用ExerciseController连接到该应用程序。我需要做的最后几个需要上传的文件。我使用我的现有表单执行此操作,如下所示:

<form action="@Url.Action("CountWord", "Exercises")" method="post">
<input type="text" name="findWord" value="@if (Model != null) {@Model.findWord}" /><br /><br />

<input name="file" type="file" /><br />

<p>
    <label>Result: </label><input type="number" name="total" value="@if (Model != null) {@Model.total}" disabled />
</p><br />
<button type="submit">Count Words</button>
我曾多次尝试从ViewModel内部的文件中获取信息,但似乎没有任何效果。每当我试图引用它时,该变量似乎都无法访问。因此,我转而转到我的ExerciseController,在那里我定义了它

public ActionResult CountWord(CountWordPostModel model)
    {
        StreamReader stream = new StreamReader(model.fileUpload.InputStream);
        string text = stream.ReadToEnd();
        var word = model.findWord;
        var wordinator = new Wordinator(text);

        var result = new CountWordViewModel
        {
            text = text, findWord = word,
            total = wordinator.CountWord(word)
        };

        return View(result);
    }
这里的问题是它告诉我这个文件是空的。当然不应该是这样,因为只有在提交的情况下才应该走到这一步


任何关于哪里出了问题的想法,或者一种更简单的方法,我们都将不胜感激。我已经把头撞在一堵象征性的墙上有一段时间了。

首先要观察的是,您的输入是name file,而model字段是fileUpload。它们应该匹配HTML视图中的字段名为file,但视图模型的字段名为fileUpload。此外,虽然这不会影响功能,但在C中编写公共成员名的惯用方法是使用驼峰大小写。所以试着用FileUpload代替FileUpload,用Total代替Total,等等。我从经验中知道,被认为永远是私有的代码有一种结局不是这样的,如果你遵守与其他程序员一样广泛使用的表示约定,分享代码时会更容易。啊哈@安德烈,非常感谢你!我完全错过了。这就解决了它。而不是StreamReader stream=新的StreamReadermodel.fileUpload.InputStream;尝试使用StreamReader stream=new StreamReadermodel.fileUpload.InputStream{…//代码的其余部分}因为StreamReader实现IDisposable,所以应该在变量流上使用using块。这样,会自动为您调用.Dispose,这将清理所有已使用的资源。
public ActionResult CountWord(CountWordPostModel model)
    {
        StreamReader stream = new StreamReader(model.fileUpload.InputStream);
        string text = stream.ReadToEnd();
        var word = model.findWord;
        var wordinator = new Wordinator(text);

        var result = new CountWordViewModel
        {
            text = text, findWord = word,
            total = wordinator.CountWord(word)
        };

        return View(result);
    }