2013-11-21 19 views
6

ゼロになるので、私はこのようなコントローラー持って、私はフォームを投稿するとASP.NET MVCのポストリストは非常に奇妙な状況下で

<h2>Test</h2> 

@using (Html.BeginForm("Post", "Test")) 
{ 
    @Html.Hidden("LanguageStrings[0].Val", "test1") 
    @Html.Hidden("LanguageStrings[0].Another") 
    @Html.Hidden("LanguageStrings[1].Val", "test2") 
    @Html.Hidden("LanguageStrings[1].Another") 

    @Html.Hidden("LanguageStringsGroup[0].Val", "test4") 

    @Html.Hidden("Deleted[0]") 
    @Html.Hidden("Deleted[1]") 
    @Html.Hidden("Deleted[2]") 

    @Html.Hidden("DeletedGroup[0]") 

    <button>Post</button> 
} 

を私のコントローラLanguageStringsがnullのため例外がスローされます。私がタイトルで言及した奇妙な部分は、リストにもう1つのレコードを追加するとすべてが機能するということです。このよう :私は「削除」のリストを削除するとき

<h2>Test</h2> 

@using (Html.BeginForm("Post", "Test")) 
{ 
    @Html.Hidden("LanguageStrings[0].Val", "test1") 
    @Html.Hidden("LanguageStrings[0].Another") 
    @Html.Hidden("LanguageStrings[1].Val", "test2") 
    @Html.Hidden("LanguageStrings[1].Another") 
    @Html.Hidden("LanguageStrings[2].Val", "test3") 
    @Html.Hidden("LanguageStrings[2].Another") 

    @Html.Hidden("LanguageStringsGroup[0].Val", "test4") 

    @Html.Hidden("Deleted[0]") 
    @Html.Hidden("Deleted[1]") 
    @Html.Hidden("Deleted[2]") 

    @Html.Hidden("DeletedGroup[0]") 

    <button>Post</button> 
} 

また、動作します。このよう :

<h2>Test</h2> 

@using (Html.BeginForm("Post", "Test")) 
{ 
    @Html.Hidden("LanguageStrings[0].Val", "test1") 
    @Html.Hidden("LanguageStrings[0].Another") 
    @Html.Hidden("LanguageStrings[1].Val", "test2") 
    @Html.Hidden("LanguageStrings[1].Another") 

    @Html.Hidden("LanguageStringsGroup[0].Val", "test4") 

    @Html.Hidden("DeletedGroup[0]") 

    <button>Post</button> 
} 

これは私が使用している命名とは何かを持っています。私はすでに何かにLanguageStringの名前を変更することでこの問題を解決しました。しかし、ここで何が起こっているのか理解したいのは、おそらくMVCがどのように身体を要求しているのかを学ぶことができ、同様の時間がかかる問題を避けることができるからです。 私を助けて、その原因を説明してください。

答えて

5

あなたは既にMVCで修正されていMVC 4のPrefixContainerにバグを発見したが、5ここ

が持つ固定バージョンですバグについてのコメント:

internal bool ContainsPrefix(string prefix) 
{ 
    if (prefix == null) 
    { 
     throw new ArgumentNullException("prefix"); 
    } 

    if (prefix.Length == 0) 
    { 
     return _sortedValues.Length > 0; // only match empty string when we have some value 
    } 

    PrefixComparer prefixComparer = new PrefixComparer(prefix); 
    bool containsPrefix = Array.BinarySearch(_sortedValues, prefix, prefixComparer) > -1; 
    if (!containsPrefix) 
    { 
     // If there's something in the search boundary that starts with the same name 
     // as the collection prefix that we're trying to find, the binary search would actually fail. 
     // For example, let's say we have foo.a, foo.bE and foo.b[0]. Calling Array.BinarySearch 
     // will fail to find foo.b because it will land on foo.bE, then look at foo.a and finally 
     // failing to find the prefix which is actually present in the container (foo.b[0]). 
     // Here we're doing another pass looking specifically for collection prefix. 
     containsPrefix = Array.BinarySearch(_sortedValues, prefix + "[", prefixComparer) > -1; 
    } 
    return containsPrefix; 
} 
+0

このコードはどこですか? – raklos

+0

MVC5はそのコードを持っているので、MVC5にアップグレードするだけです。 PrefixContainerの最新ソースコードはhttps://aspnetwebstack.codeplex.com/SourceControl/latest#src/Common/PrefixContainer.csです。 – LostInComputer

0

@ Html.HiddenFor()を使用してコントローラにポストバックするのに成功しました。コードは次のようになります。

@for (int i = 0; i < @Model.LanguageStrings.Count; i++) 
{ 
    @Html.HiddenFor(model => model.LanguageStrings[i].Val, string.Format("test{0}", i)) 
    @Html.HiddenFor(model => model.LanguageStrings[i].Another) 
} 

ほとんどのHTMLヘルパーメソッドには、データをモデルにバインドするためのヘルパーがあります。ここでは方法だけでなく、「について」を説明し、サイト上の別のポストです:What is the difference between Html.Hidden and Html.HiddenFor

関連する問題