Параметр FormCollection пуст при использовании @Ajax.BeginForm и @Ajax.ActionLink

Я прошел целую кучу ТАК вопросов, касающихся моей проблемы, и я не смог найти решение, поэтому я решил опубликовать этот вопрос. Проблема в том, что FormColection fc пусто, когда я делаю этот запрос Ajax POST, нажав кнопку поиска из _Sidebar.cshtml, Что мне здесь не хватает?

Часть кода:
_MyLayout.cshtml:

@using (Ajax.BeginForm("Results", "Search", null, new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "d_content", LoadingElementId = "spinner", OnBegin = "ToggleContent", OnComplete = "ToggleContent" },null))
{
    <div class="wrapper row-offcanvas row-offcanvas-left">
        <div id="a_sidebar">
            @{ Html.RenderAction("_Sidebar"); }
        </div>
        <aside class="right-side">
            <section class="content">
                <img id="spinner" src="~/Content/img/lightbox-ico-loading.gif" style="display: none;">
                <div id="d_content">
                    @RenderBody()
                </div>
            </section>
        </aside>
    </div>
}

_Sidebar.cshtml:

<ul class="treeview-menu">
                <li>
                    <div class="form-group">
                        <label>F1</label> 
                        @Html.ListBox("ddF1", (MultiSelectList)ViewData["ddF1"])
                    </div>
                    <div class="form-group">
                        <label>F2</label>
                        @Html.ListBox("ddF2", (MultiSelectList)ViewData["ddF2"])
                    </div>
                    <div class="form-group">
                        <label>Status</label>
                        @Html.ListBox("ddStatusFilter", (MultiSelectList)ViewData["ddStatusFilter"])
                    </div>
                    <div class="form-group">
                        <label>Name</label>
                        @Html.TextBox("tbName")
                    </div>
                </li>
            </ul>

<li class="treeview">

            <div style="text-align: center;">
                <button type="reset" class="btn btn-warning">Clear Filters</button>
                @Ajax.ActionLink("Search", "Results", "Search", new { }, new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "d_content", LoadingElementId = "spinner", OnBegin = "ToggleContent", OnComplete = "ToggleContent" }, new { @class = "btn btn-success", @style = "color: white;" })
            </div>
        </li>

SearchController.cs:

[HttpPost]
[AcceptVerbs(HttpVerbs.Post)]
public PartialViewResult Results(FormCollection fc)
{
    //TODO: Implement filtering through FormCollection in passed parameter
    //      but that freakin' fc var is empty
    var model = db.vw_MainTable.ToList();
    return PartialView("_SearchResultGrid", model);
}

Очень признателен.

2 ответа

Решение

Исходя из кода, похоже, вам не нужен тег формы, охватывающий весь ваш HTML. Вы можете разместить его в _Sidebar.cshtml как это.

Также замените ссылку действия кнопкой отправки (проверьте код ниже).

@using (Ajax.BeginForm("Results", "Search", null, new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "d_content", LoadingElementId = "spinner", OnBegin = "ToggleContent", OnComplete = "ToggleContent" },null))
{
             <ul class="treeview-menu">
                <li>
                    <div class="form-group">
                        <label>F1</label> 
                        @Html.ListBox("ddF1", (MultiSelectList)ViewData["ddF1"])
                    </div>
                    <div class="form-group">
                        <label>F2</label>
                        @Html.ListBox("ddF2", (MultiSelectList)ViewData["ddF2"])
                    </div>
                    <div class="form-group">
                        <label>Status</label>
                        @Html.ListBox("ddStatusFilter", (MultiSelectList)ViewData["ddStatusFilter"])
                    </div>
                    <div class="form-group">
                        <label>Name</label>
                        @Html.TextBox("tbName")
                    </div>
                </li>
           </ul>    
           <li class="treeview">
            <div style="text-align: center;">
                <button type="reset" class="btn btn-warning">Clear Filters</button>
                <button type="submit" class="btn"> Search</button>
            </div>
           </li
}

Там может быть несколько причин для этого. В моем случае это происходило потому, что в моих полях формы было только свойство ID, а не свойство Name.

После добавления свойства Name в поля ввода Контроллер мог видеть их очень хорошо.

Другие вопросы по тегам