提交表单时不要包含空参数

时间:2014-05-14 13:58:12

标签: html asp.net asp.net-mvc url razor

我的控制器上的索引方法如下所示:

public ActionResult Index(string search, string sort, int? groupId)

对于搜索功能,我有以下表格:

@using (Html.BeginForm())
{
    <div>
        @Html.Label("search", "Search")
        @Html.TextBox("search", ViewBag.Search as string)
        @Html.Hidden("sort", ViewBag.Sort as string)
        @Html.Hidden("groupId", ViewBag.GroupId as int?)
        <input type="submit" value="Search" />
    </div>
}

Viewbag.SearchViewBag.SortViewBag.GroupId包含最后使用的参数。这些可以是null"",如果是,则是我在使用搜索表单时看到的网址:

...?search=foo&sort=&groupId=

如何从网址中隐藏这些空参数,看起来像...?search=foo


编辑:正如Jason Nesbitt所说,您可以禁用隐藏字段以将其从表单中排除。但是,我还想隐藏来自除hidden字段以外的其他内容的空参数,例如常规input字段以及select列表。

2 个答案:

答案 0 :(得分:9)

如果您想坚持使用GET方法,您可以使用浏览器不会发送禁用字段的事实。因此绑定到onsubmit处理程序并禁用任何空的隐藏字段,如下所示:

@using (Html.BeginForm("Calculate", "Home", FormMethod.Get, new {onsubmit="DisableNullFields();"}))
{
    @Html.TextBoxFor(x => x.Test)
    <input type="text" name="TestField" />
    <input type="hidden" name="hidden" value="" />
    <input type="submit" value="Push"/>
}

<script>
    function DisableNullFields() {
        $('input[type=hidden]').each(function(i) {
            var $input = $(this);
            if ($input.val() == '')
               $input.attr('disabled', 'disabled');
        });
    }
</script>

答案 1 :(得分:0)

您可以使用POST而不是GET。因此,您可以将包含隐藏字段的表单替换为您不希望在查询字符串中显示的参数:

@using (Html.BeginForm("EventOverview", "BaseEvent", new { id = eventInfo.Key.OID, type = eventInfo.Key.XPObjectType.TypeName.GetShortTypeName() }, FormMethod.Post, null))
{
    @Html.Hidden("activeTab", "#scheduleLink")
    @Html.Hidden("session", eventInfo.Key.EventSchedules[0].SessionId)
    @Html.Hidden("hall", eventInfo.Key.EventSchedules[0].HallId)
    @Html.Hidden("client", eventInfo.Key.EventSchedules[0].BasePlace.PremieraClientId)
    <button type="submit">Make</button>
}
来自Darin Dimitrov的回答:

hide parameters passing to controller in address bar (URL rewrite or something else)