2012-08-24 33 views
0

我不知道我做錯了什麼。 那麼我有這種形式,它是複雜的看法的一部分。數據綁定MVC3

@{ 
    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「爲空,其他字段設置正確。雖然,當我在手錶中插入Request.Form時,我可以看到整個數據。

更新1 所以我設置<全球化> Web.config中就象這樣:

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

,但它不工作。與以前非常相同的結果。

更新2 此外,當我試圖把所有的routevalues數據爲@ Html.HiddenFor,控制器只看到了空。再次,Request.Form被填充prprly。

所以問題是:如何將表單數據綁定到傳入模型? TY

+0

你可以發佈你的'filtersAjaxOptions'?你使用什麼文化?你可以發佈樣本日期嗎? – nemesv

+0

filterAjaxOptions是好的,但確定,生病 –

+0

我使用默認的MVC3文化,這是我相信「EN-US」? –

回答

1

默認模型聯編程序在綁定日期時間時使用當前區域性日期時間格式。這意味着您必須在文本框中輸入適當格式的日期。另一方面,如果你需要一個固定的格式,你可以在你的網絡中使用固定的文化。配置( <globalization>元素)或編寫自定義的模型綁定: https://stackoverflow.com/a/7836093/29407


UPDATE:

您需要指定正確的綁定前綴,因爲你的輸入字段被命名爲喜歡ClientListViewModel.Filters.BeginDateRange但你的控制器動作需要FilterModel作爲參數而不是根視圖模型:

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

但現在這會打破其他值,所以你需要調整你R視角,以及:

@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", 
     } 
    ) 
} 
+0

對我沒有幫助 –

+0

您能提供該領域的樣本數據嗎? –

+0

01/01/2012 as en-US。我還嘗試了01.01.2012和ru-RU文化。工作 –

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", 
      } 
     ) 

你有奇怪的命名。另外,最好使用隱藏字段,然後通過路由值傳遞值。

+0

>>你有奇怪的命名 - 可以üplz點奇怪? –

+0

>>也可以使用隱藏字段,然後通過路由值傳遞值。 - 爲什麼? –

+0

m => m.ClientListViewModel.Filters.EndDateRange你有ClientListViewModel和Filters。這會更好 - > ClientListViewModel.FilterModel – karaxuna