1

控制器:

// other usings are removed for the sake of brevity
using MvcMovie.Models;

namespace MvcMovie.Controllers
{
    public class MoviesController : Controller
    {
        private MoviewDBContext db = new MoviewDBContext();

        public ActionResult SearchIndex(string searchString)
        {
            var movies = db.Movies.Select(x => x);
            if (!string.IsNullOrEmpty(searchString))
                movies = movies.Where(x => x.Title.Contains(searchString));

            return View(movies);
        }

    }
}

看法:

// SearhcIndex.cshtml

@model IEnumerable<MvcMovie.Models.Movie>

@using (Html.BeginForm())
{
    <p>
        Title: @Html.TextBox("searchString")
        <br />
        <input type="submit" value="Filter" />
    </p>
}

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
        </tr>
    }

</table>

我第一次访问时localhost/Movies/SearchIndexHttpGet SearchIndex将调用 并填充相应视图的模型。在浏览器上呈现视图后,我输入一个单词以过滤掉列表,然后按下提交按钮Filter

我的问题是:

Filter在我看来,单击将提交带有 POST 动词的表单。但是为什么会再次HttpGet SearchIndex调用呢?我还没有实施(当然)。HttpPost SearchIndex

注意:我是新手,请不要在没有给出我可以学习的理由的情况下投反对票。我正在阅读本教程“检查编辑方法和编辑视图”

4

3 回答 3

5

它这样做是因为您没有指定它应该只处理 get 请求,所以默认情况下它会同时处理这两个请求。如果您要添加该HttpGet属性,它将具有您所期望的行为

    [HttpGet]
    public ActionResult SearchIndex(string searchString)
    {
        var movies = db.Movies.Select(x => x);
        if (!string.IsNullOrEmpty(searchString))
            movies = movies.Where(x => x.Title.Contains(searchString));

        return View(movies);
    }

    [HttpPost]
    public ActionResult SearchIndex(string searchString, string someOtherParam)
    {
        var movies = db.Movies.Select(x => x);
        if (!string.IsNullOrEmpty(searchString))
            movies = movies.Where(x => x.Title.Contains(searchString));
        //do something different than your get...
        return View(movies);
    }

请注意,我在这里包含了另一种处理 Post 的方法,当然您仍然希望这样做。正如评论中提到的,如果这仍然失败,请在您的表单中明确指定 POST,尽管,我从来不需要这样做来完成这项工作,我不希望您在这里需要它。

另请注意,您的 post 方法将需要一个不同的名称,或者它需要与您的 get 不同的参数(以便.net 可以区分它们)

既然你提到是新手,这里是我喜欢的 MVC 教程,并且在启动 MVC 时让新开发人员阅读: http ://www.asp.net/mvc/tutorials/mvc-music-store

如果你还没有这样做,你应该检查一下!

更新

根据您的评论,这是他们在您提供的链接上告诉您的内容。当一个请求被路由到你的控制器时,MVC 将选择第一个与请求完全匹配的 Action Method。如果您不申请[HttpGet],或者[HttpPost]该操作方法将同时接受两者。因此,假设您浏览到 /mysite/Movies/SearchIndex。使用上面的示例,这是一个 GET 请求,因此 MVC 会看到您的 SearchIndex 标有 [HttpGet],这就是它将使用的内容。

现在假设您删除了另一个,[HttpGet]但保留[HttpPost]了另一个(如您提供的文章中的示例)。如果您浏览到 /mysite/Movies/SearchIndex MVC 看到标有 HTTPPost 的 SearchIndex() 并说,不能使用那个!然后它看到 SearchIndex() 没有属性(意味着它接受 Post 和 Get)并使用它。

同样,如果您使用 POST 请求引发 /mysite/Movies/SearchIndex,MVC 会看到您有一个 SearchIndex() 标记,[HttpPost]因此它使用那个,因为它是完全匹配的。

这篇文章没有在这里传达的一点是,方法的默认行为是同时接受 GET 和 POST。这篇文章在这一点上实际上是在说什么,给定一个特定的场景,一个被标记[HttpPost]而另一个根本没有被标记,默认行为将导致使用未标记的 Action Method。

如果这令人困惑,我深表歉意,我重写了好几次,但解释起来有点复杂。

于 2013-06-19T14:37:48.383 回答
0

你是对的,表格将使用 POST 方法发送。它使用 POST 动词发送到您的 SearchIndex 操作。要检查请使用 HttpGet 属性装饰您的 SearchIndex 操作:

[HttpGet]
public ActionResult SearchIndex(string searchString)
    {
        var movies = db.Movies.Select(x => x);
        if (!string.IsNullOrEmpty(searchString))
            movies = movies.Where(x => x.Title.Contains(searchString));

        return View(movies);
    }

添加动词 filder 后,尝试 POST 时会出错。

于 2013-06-19T14:40:31.500 回答
0

我认为因为你没有 POST 方法和 GET 默认调用。在 SearchIndexaction 之后添加这个

[HttpPost]
public ActionResult SearchIndex(string searchString)
        {
          do post stuff here
        }
于 2013-06-19T14:38:54.497 回答