0

何が間違っているのかわかりません。さて、私はこのフォームを持っています、それは複雑なビューの一部です。

    @{
    var filtersAjaxOptions = new AjaxOptions
        {
            HttpMethod = "POST",
            InsertionMode = InsertionMode.Replace,
            UpdateTargetId = "clientList-body",
            OnBegin = "clientList.filterRequestStart()",
            OnComplete = "clientList.filterRequestComplete()",
            OnSuccess = "clientList.filterRequestSuccess()"
        };
    }
    <span class="clientFilters-filterValue inlineBlock">
        @using (Ajax.BeginForm(
            "Index",
            "ClientList",
            new {
                ProductId = Model.ClientListViewModel.Filters.ProductId,
                ClientFilter = Model.ClientListViewModel.Filters.ClientFilter,
                BillFilter = Model.ClientListViewModel.Filters.BillFilter,
                DateSortType = Model.ClientListViewModel.Filters.DateSortType,
                SortDirection = Model.ClientListViewModel.Filters.SortDirection
            },
            filtersAjaxOptions,
            new
            {
                id = "clientListDateFilter-form"
            }
        ))
        {
            @Html.TextBoxFor(
                m => m.ClientListViewModel.Filters.BeginDateRange,
                new
                {
                    @class = "dp-input textInput inlineBlock",
                    id = "dp-billDateFilterStart",
                }
            )
            @Html.TextBoxFor(
                m => m.ClientListViewModel.Filters.EndDateRange,
                new
                {
                    @class = "dp-input textInput inlineBlock",
                    id = "dp-billDateFilterEnd",
                }
            )
        }
    </span>

これがフィルターモデルです

    public class FilterModel
    {
        public FilterModel()
        {
            ClientFilter = ClientsEnum.All;
            BillFilter = ClientBillsEnum.All;
        }

        public string ProductId { get; set; }
        public ClientsEnum ClientFilter { get; set; }
        public ClientBillsEnum BillFilter { get; set; }
        public DateTime? BeginDateRange { get; set; }
        public DateTime? EndDateRange { get; set; }
        public DateSortType? DateSortType { get; set; }
        public SortDirection? SortDirection { get; set; }
    }

この部分はClientListControllerメソッドインデックスです:

    public ActionResult Index(FilterModel filters)
    {
        var clientListViewModel = GetClientListViewModel(filters, 1, 1, PageSize);
        if (ControllerContext.HttpContext.Request.IsAjaxRequest())
            return PartialView("Partial/ClientListBody", clientListViewModel);
        return View(clientListViewModel);
    }

上記のフォームを送信するたびに、フィールド「BeginDateRange」と「EndDateRange」がnullであり、他のフィールドが適切に設定されていることがわかります。ただし、 WatchにRequest.Formを挿入すると、データ全体を表示できます。

UPDATE 1 そこで、Web.configの<グローバリゼーション>を次のように設定します。

    <globalisation responseHeaderEncoding="utf-8" culture="en-US">

それでも機能しません。以前と非常に同じ結果。

UPDATE 2 また、すべてのroutevaluesデータを@ Html.HiddenForに入れようとすると、コントローラーはnullのみを認識しました。また、Request.Formは正しく入力されています。

したがって、問題は、フォームデータを受信モデルにバインドするにはどうすればよいですか?TY

4

2 に答える 2

1

既定のモデル バインダーは、日時をバインドするときに現在のカルチャの日時形式を使用します。これは、テキストボックスに適切な形式で日付を入力する必要があることを意味します。一方、固定形式が必要な場合は、web.config (<globalization>要素) で固定カルチャを使用するか、カスタム モデル バインダーを記述します: https://stackoverflow.com/a/7836093/29407


アップデート:

入力フィールドの名前は次のようになっていますが、コントローラー アクションはルート ビュー モデルの代わりに as パラメーターをClientListViewModel.Filters.BeginDateRange取るため、正しいバインディング プレフィックスを指定する必要があります。FilterModel

public ActionResult Index([Bind(Prefix = "ClientListViewModel.Filters")] FilterModel filters)
{
    ...
}

しかし、これにより他の値が壊れてしまうため、ビューも調整する必要があります。

@using (Ajax.BeginForm(
    "Index",
    "ClientList",
    null,
    filtersAjaxOptions,
    new
    {
        id = "clientListDateFilter-form"
    }
 ))
{
    @Html.HiddenFor(x => x.ClientListViewModel.Filters.ProductId)
    @Html.HiddenFor(x => x.ClientListViewModel.Filters.ClientFilter)
    @Html.HiddenFor(x => x.ClientListViewModel.Filters.BillFilter)
    @Html.HiddenFor(x => x.ClientListViewModel.Filters.DateSortType)
    @Html.HiddenFor(x => x.ClientListViewModel.Filters.SortDirection)

    @Html.TextBoxFor(
        m => m.ClientListViewModel.Filters.BeginDateRange,
        new
        {
            @class = "dp-input textInput inlineBlock",
            id = "dp-billDateFilterStart",
        }
    )
    @Html.TextBoxFor(
        m => m.ClientListViewModel.Filters.EndDateRange,
        new
        {
            @class = "dp-input textInput inlineBlock",
            id = "dp-billDateFilterEnd",
        }
    )
}

または、非表示フィールドを使用する代わりに、フォーム URL の一部としてそれらを送信する場合:

@using (Ajax.BeginForm(
    "Index",
    "ClientList",
    new RouteValueDictionary 
    { 
        { "ClientListViewModel.Filters.ProductId", Model.ClientListViewModel.Filters.ProductId },
        { "ClientListViewModel.Filters.ClientFilter", Model.ClientListViewModel.Filters.ClientFilter },
        { "ClientListViewModel.Filters.BillFilter", Model.ClientListViewModel.Filters.BillFilter },
        { "ClientListViewModel.Filters.DateSortType", Model.ClientListViewModel.Filters.DateSortType },
        { "ClientListViewModel.Filters.SortDirection", Model.ClientListViewModel.Filters.SortDirection },
    },
    filtersAjaxOptions,
    new RouteValueDictionary
    {
        { "id", "clientListDateFilter-form" }
    }
 ))
{
    @Html.TextBoxFor(
        m => m.ClientListViewModel.Filters.BeginDateRange,
        new
        {
            @class = "dp-input textInput inlineBlock",
            id = "dp-billDateFilterStart",
        }
    )
    @Html.TextBoxFor(
        m => m.ClientListViewModel.Filters.EndDateRange,
        new
        {
            @class = "dp-input textInput inlineBlock",
            id = "dp-billDateFilterEnd",
        }
    )
}
于 2012-08-24T06:47:49.027 に答える
0

これを試して:

public ActionResult Index(FilterModel filters, FormCollection collection)
{
    UpdateModel(filters, "ClientListViewModel");
    var clientListViewModel = GetClientListViewModel(filters, 1, 1, PageSize);
    if (ControllerContext.HttpContext.Request.IsAjaxRequest())
        return PartialView("Partial/ClientListBody", clientListViewModel);
    return View(clientListViewModel);
}

そしてビューで:

@Html.TextBoxFor(
            m => m.ClientListViewModel.FilterModel.EndDateRange,
            new
            {
                @class = "dp-input textInput inlineBlock",
                id = "dp-billDateFilterEnd",
            }
        )

変なネーミングですね。また、ルート値を介して値を渡すよりも、隠しフィールドを使用することをお勧めします。

于 2012-08-24T06:46:31.903 に答える