2013-07-01 58 views
0

我有這樣的方法:爲什麼綁定這個列表不適用於POST?

[HttpPost] 
    public ActionResult LaunchVisualiser(IList<VisualiserModel> selectedVisualisers, int implicitSelectedVisualiserId) 
    { 
     List<int> selectedSearchQueries = searchQueryRepository.GetSearchQueriesOfStreamsIds(selectedVisualisers.Where(v => v.Selected == true).Select(v => v.Stream.Id).ToList()); 
    // rest of my code 
    } 

,並在視圖:

@model List<SocialCrm.Models.VisualiserModel> 

@using (Html.BeginForm("LaunchVisualiser", "Platform", new { implicitSelectedVisualiserId = ViewBag.CurrentVisualiser.Id }, FormMethod.Post)) 
{ 
    for (int i = 0; i < Model.Count; i++) 
    { 
     if (Model[i].Id == ViewBag.CurrentVisualiser.Id) 
     { 
      continue; 
     } 

    @Html.HiddenFor(m => Model[i].Stream.Id) 
    <div class="editor-label"> 
     @Html.CheckBoxFor(m => Model[i].Selected) 
     @Html.DisplayFor(m => Model[i].Name) 
    </div> 
    } 
    <br /> 
    <br /> 
    <input type="submit" class="btn btn-success" name="temp" value="Launch Visualiser" /> 
} 

我只是不明白,爲什麼selectedVisualisers做的職位時總是空。

你有什麼線索嗎?我見過這樣的例子很多,也許我失去了一些東西......

UPDATE

生成的HTML是:

<form action="/platform/launchvisualiser?implicitSelectedVisualiserId=1" method="post"> 
<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." name="[1].Stream.Id" type="hidden" value="9"> <div class="editor-label"> 
     <input data-val="true" data-val-required="The Selected field is required." name="[1].Selected" type="checkbox" value="true"><input name="[1].Selected" type="hidden" value="false"> 
     test java hiring visualiser 
    </div> 
<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." name="[2].Stream.Id" type="hidden" value="8"> <div class="editor-label"> 
     <input data-val="true" data-val-required="The Selected field is required." name="[2].Selected" type="checkbox" value="true"><input name="[2].Selected" type="hidden" value="false"> 
     vis test 
    </div> 
    <br> 
    <br> 
    <input type="submit" class="btn btn-success" name="temp" value="Launch Visualiser"> 
</form> 

,這在表單數據發送到服務器(檢查Chrome瀏覽器):

[1].Stream.Id:9 
[1].Selected:true 
[1].Selected:false 
[2].Stream.Id:8 
[2].Selected:false 

回答

1

嘗試這樣的:

@Html.HiddenFor(m => m[i].Stream.Id) 
<div class="editor-label"> 
    @Html.CheckBoxFor(m => m[i].Selected) 
    @Html.DisplayFor(m => m[i].Name) 
</div> 

順便說一下,當您檢查此剃刀視圖生成的HTML時,我希望if語句不是多次命中,並且在<form>元素中至少有一些輸入。

使用FireBug或Chrome開發人員工具欄來檢查發送到服務器的郵件是否是POST請求的有效內容。

此外,continue;聲明存在問題。根據默認model binder for binding to a list的預期格式,這可能會在漏洞中留下您要提交給服務器的索引。

當您在提琴手檢查POST有效載荷你不應該看到(問題):

[0].Stream.Id = 5 
[0].Selected = true 
[0].Name = name 1 
[2].Stream.Id = 7 
[2].Selected = true 
[2].Name = name 4 

通知的中,如果continue語句被擊中可能發生的索引。爲了解決這個問題,我會建議你使用非序列索引。如果你還沒有這樣做,請閱讀Phil Haack的文章,我之前在我的回答中提到過這個文章。他在一個單獨的章節中解釋了非序列索引。所以繼續,使用它們。史蒂文桑德森在他出色的Editing Variable Length List in ASP.NET MVC博客文章中說明了一個優秀的Html.BeginCollectionItem定製助手,可以適應您的需求。

+0

謝謝!正如你所說,「繼續」聲明是問題... –

相關問題