2016-11-17 46 views
0

如果您有任何人可以提供一些幫助或建議嗎? 我有一個MVC表單(它實際上是一個Umbraco表單/表面控制器,但我不知道這對此有什麼影響),其模型包含用於使用HTML幫助程序生成複選框的對象列表方法;請參閱以下文章,瞭解如何渲染這些內容並將其接收到我的子操作中:https://stackoverflow.com/a/20687405/1285676並非所有MVC表單中的值都發布

除了儘管所有複選框都在提交時發佈,但並非所有複選框都被拾取,所有似乎都運行良好在我的控制器中由ActionResult方法接收的模型。我使用chrome中的網絡工具查看了發佈的數據,並且所有內容似乎都正常。(所有複選框似乎都以相同的格式發佈),因此,百萬美元的問題是,可以預防哪些問題從模型中拾取一些值?

這裏是我的形式呈現的複選框一個snipet,削減爲剩下的應該是不相關的(是的,有在真實的東西提交按鈕..):

@model MemberPreferencesVM 
@using (Html.BeginUmbracoForm<MemberAccountSurfaceController>("HandleDealerMemberPreferencesAccountUpdate", FormMethod.Post, new { @class = "", @id = "dealer-member-account-preferences-form" })) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 
    @for (var j = 0; j < Model.Brands.Count; j++) 
    { 
     if (Model.Brands[j].Division == Model.Divisions[i].Id.ToString()) 
     { 
      var divisionSelected = Model.Divisions.Any(x => x.Id.ToString() == Model.Brands[j].Division) ? Model.Divisions.FirstOrDefault(x => x.Id.ToString() == Model.Brands[j].Division).Checked : false; 
      var checkboxAttr = new Dictionary<string, object> { { "class", "styled" }, { "data-division", Model.Brands[j].Division } }; 
      var brandSelected = Model.Brands[j].Checked; 

      <div class="col-xs-4"> 
       <label class="option @if (divisionSelected && brandSelected){<text>active</text>}"> 
        <img src="@(Model.Brands[j].LogoUrl)" class="center-block" alt="@(Model.Brands[j].Name)" /> 
        <span class="checkbox"> 
         @Html.HiddenFor(model => model.Brands[j].Id) 
         @Html.HiddenFor(model => model.Brands[j].Name) 
         @Html.CheckBoxFor(model => model.Brands[j].Checked, checkboxAttr) 
        </span> 
       </label> 
      </div> 
     } 
    } 
} 

略有減少該模型的版本:

public class MemberPreferencesVM: IValidatableObject 
{ 
    public MemberPreferencesVM() 
    { 
     init(); 
    } 
    private void init() 
    { 
     Divisions = [Logic to fetch divisions]; 
     Brands = [Logic to fetch brands]; 
    } 
    public IList<DivisionVM> Divisions { get; set; } 
    public IList<BrandVM> Brands { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var pDivisions = new[] { "Divisions" }; 
     var pBrands = new[] { "Brands" }; 
     if (!Divisions.Any(x => x.Checked)) 
     { 
      yield return new ValidationResult("Select at least 1 division to view by default", pDivisions); 
     } 
     if (!Brands.Any(x => x.Checked)) 
     { 
      yield return new ValidationResult("Select at least 1 brand to view by default", pBrands); 
     } 
    } 
} 

BrandVM:

public class BrandVM 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string LogoUrl { get; set; } 
    public bool Checked { get; set; } 
    public string Division { get; set; } 
} 

的的ActionResult:

[ValidateAntiForgeryToken] 
[ValidateInput(true)] 
[HttpPost] 
public ActionResult HandleDealerMemberPreferencesAccountUpdate(MemberPreferencesVM model) 
{ 
    //logic removed as model doesn't arrive will all values so not relevant 
    return CurrentUmbracoPage(); 
} 

模型應該包含24個品牌,它永遠只能在似乎「HandleDealerMemberPreferencesAccountUpdate」與12

任何幫助表示讚賞到達(我希望它是簡單的東西,我已經溜了)..

馬克

+0

您必須爲不屬於表單用戶界面的值添加隱藏字段,並且要提交它們。 –

+0

唉,我已經嘗試過了,但沒有什麼區別...... 24中的12個通過了。它們似乎無所謂,如果他們被檢查與否,12通過的是各種品牌的混合各個部門。 –

+0

我想還有其他的東西在你告訴我們的之外。是否有任何複選框通過JavaScript被禁用?當然,當你瀏覽發佈的數據時,他們不會出現。數據中的所有數據都顯示在開發工具中? – krillgar

回答

0

好吧,這原來是我的數據問題,這應該是不可能的。上述

斯蒂芬·馬克的評論是確實是正確的

你有你的for循環內的if塊。如果該評估結果爲false,則意味着您跳過了「索引器」,並且提交時綁定將失敗。默認情況下,收集索引器必須從零開始並且是連續的。儘管可以爲索引器添加輸入以使其工作,但應該使用僅包含視圖中所需的對象的視圖模型。

從本質上講,我的一個品牌沒有與其相關的部門,因此它沒有正確發佈到控制器中,從而破壞了解決方案。代碼確實需要重構,所以這是不可能的,儘管我已經在CMS中進行了更改以防止再次發生這種情況。

希望這會幫助別人,感謝所有的指針。

相關問題