在将表单提交到MVC3操作之前,有条件地重置输入元素值

时间:2011-09-25 10:56:15

标签: asp.net-mvc-3 jquery-ui

这可能是一个简单的问题,但我是MVC3的jQuery新手。我有一个MVC3应用程序,其中索引操作列出了与作者的一些文章。用户可以通过(以及其他参数)作者名称来过滤列表,因此我有一个使用jQueryUI自动完成的输入元素,让他们输入一些字母并选择所需的作者。当发生这种情况时,我的JS代码将其ID存储到隐藏元素中并发布表单;然后,ID通过模型绑定器传递给表示我所有过滤器的对象。

过滤器对象如下:

public sealed class PaperFilter
{
  public int? AuthorId { get; set; }
  // ... other params here
}

控制器操作接收页码和排序参数(视图使用MvcContrib网格)和此过滤器。然后它创建一个视图模型,包括论文列表和表示过滤器属性的许多属性,并将其传递回视图:

public ViewResult Index(int? page, GridSortOptions sort, PaperFilter filter)
{
  var papers = _repository.GetPapers(filter);
  if (sort.Column != null)
    papers = papers.OrderBy(sort.Column, sort.Direction);
  ViewBag.Sort = sort;

  PaperIndexModel model = new PaperIndexModel(filter)
    { Papers = papers.AsPagination(page ?? 1, 10) };

  if (filter.AuthorId.HasValue)
  {
    Author author = _repository.GetAuthor((int)filter.AuthorId);
    model.AuthorName = author.FirstName + " " + author.LastName;
  }

  return View(model);
}

返回的模型包含论文列表以及过滤器属性的副本。

视图表格相关代码是:

...
@Html.TextBoxFor(m => m.AuthorName)
@Html.HiddenFor(m => m.AuthorId)
...

及其JS代码:

<script type="text/javascript">
  $(function () {
    $("#AuthorName").autocomplete({
      source: function (request, response) {
        $.ajax({
          url: "/Author/FindAuthor", type: "POST", dataType: "json",
          data: { LastName: request.term },
          success: function (data) {
            response($.map(data, function (item) {
              return { label: item.FirstName + ' ' + item.LastName, value: item.LastName, id: item.Id };
            }));
          }
        });
      },
      select: function (event, ui) {
        $("#AuthorName").val(ui.item.value);
        $("#AuthorId").val(ui.item.id);
        $(this).closest("form").submit();
      }
    });
  });
</script>

这很好用,无论如何我想让我的用户通过简单地清除输入框(AuthorName)并按Enter键来重置作者过滤器;但要做到这一点,我需要重置AuthorId值,即在发布表单之前执行类似 $(“#AuthorId”)。val(“”)的操作。我尝试在按键上执行此操作但在帖子发生之前似乎没有触发,因为我的操作仍会获得填充了AuthorId的过滤器。有人可以提出解决方案吗?

1 个答案:

答案 0 :(得分:0)

在你的.ajax()调用之前检查它。如果长度为0,则不必使用.ajax,只返回。