4

与えられたモデル

public class Task
{
public int TaskId { get; set; }
public string Title { get; set; }
public ICollection<SomeData> Information { get; set; }
}

どこ

public class SomeData
{
    public int SomeDataId { get; set; }
    public string Description { get; set; }
}

私は見解を持っています

@model myProject.Models.Task

<div>
    @Html.LabelFor(model => model.Title)
</div>

<table>
@Html.Partial("_InformationEdit", Model.Information.ToList(), new ViewDataDictionary(Html.ViewDataContainer.ViewData) {
                TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Information" }})
</table>                    

そして私の部分は

@model IList<myProject.Models.SomeData>

@for (int i = 0; i < Model.Count(); i++)
{
    <tr>
        <td>
            @Html.EditorFor(modelItem => Model[i].Description)
        </td>
    </tr>
 }

でも

私のHTMLフィールドは次のようにレンダリングされています

<input class="text-box single-line" id="Information__0__Description" name="Information.[0].Description" type="text">

名前はどこにあるべきかInformation[0].Description。そこに追加のドットがあるため、投稿時にモデルに正しくバインドされていません。どうすればこれを修正できますか?

リストへのモデルのバインドに従って、IDが何であるかを確認できますが、正しい構文を理解できません。

IEnumerableまた、?を使用してこれを達成するためのよりエレガントな方法はあり@foreachますか?

関連している:

ASP.Net MVC4は、「ビューの作成」をリストを含むモデルにバインドします

IList<>パラメーターをバインドするASP.NETMVCモデル

4

3 に答える 3

1

あなたのパーシャルは次のようになります:

@model IList<myProject.Models.SomeData>

@for (int i = 0; i < Model.Count(); i++)
{
  <tr>
    <td>
      @Html.EditorFor(model => model[i].Description)
    </td>
  </tr>
}

また、i を項目名に置き換えると読みやすくなります

于 2013-07-31T11:27:22.883 に答える
1

<input...次のように直接使用できます。

ページ:

<table>
    @Html.Partial("_InformationEdit", Model.Information)
</table>

部分ページ:

@for (int i = 0; i < Model.Count(); i++)
{
    <tr>
        <td>
            <input class="text-box single-line" id="Information[@i]Description" name="Information[@i].Description" type="text" value="@Model[i].Description" />
        </td>
    </tr>
}

または、例のようにプレフィックスを渡すことができるようにするには、ページコードを同じに保ち、パーシャルを次のように変更できます。

ページ:

<table>        
    @Html.Partial("_InformationEdit", Model.Information, 
        new ViewDataDictionary(Html.ViewDataContainer.ViewData) 
        {
            TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Information" }
        })
</table>

部分ページ:

@for (int i = 0; i < Model.Count(); i++)
{
    <tr>
        <td>
            @{
                string fieldName = string.Format("{0}[{1}].Description", ViewData.TemplateInfo.HtmlFieldPrefix, i);
                <input class="text-box single-line" id="@fieldName" name="@fieldName" type="text" value="@Model[i].Description" />
            }
        </td>
    </tr>
}
于 2013-02-07T13:46:48.210 に答える
1

私のパーシャルをに変更する

@model IList<myProject.Models.SomeData>

@{
    var Information = Model;
}

@for (int i = 0; i < Information.Count(); i++)
{
    <tr>
        <td>
            @Html.EditorFor(modelItem => Information[i].Description)
        </td>
    </tr>
 }

動作しますが、これは少し奇妙に思えます!

バインドされているオブジェクトが、バインドする必要があるプロパティと同じ名前であることを確認すると、いくつかの魔法がかかると思います...他の提案や説明は大歓迎です!

于 2013-02-07T16:23:30.877 に答える