1

頭の中ではかなり単純なものを作りたいと思っていますが、作成しようとすると非常に複雑です。MVC ASP.NET 環境で、1 つのモデルを作成して何度もレンダリングしたいと考えています。それは仕事ですが、データを取り戻したいときは何もありません。モデルは次のようになります。

public class HardwareModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    ...
}

ラッパーは次のようになります。

public class WrapperModel
{
    public List<HardwareModel> HardwareList { get; set; }

    public WrapperModel()
    {
        HardwareList = new List<HardwareModel>();
    }
}

コントローラー:

readonly Hardware _hardware = new Hardware();
    [Authorize]
    public ActionResult Index()
    {
        return View(_hardware.GetHardwareList(int.Parse(Session["idEmployee"].ToString())));
    }

    [HttpPost]
    [Authorize]
    public ActionResult Index(WrapperModel model)
    {
        return View(model);
    }

そしてビュー:

<% using (Html.BeginForm())
   {%>
<% foreach (var hardware in Model.HardwareList)
   {%>    
    <tr>
        <td>
            <div class="editor-label">
                <%: Html.LabelFor(m => hardware.SelectedHardwareType) %>
            </div>
            <div class="editor-field">
                <%: Html.DropDownListFor(m => hardware.SelectedHardwareType, hardware.Hardwaretypes) %>
            </div>
...

したがって、結果は次のようになります。 結果を見る

レンダリングはまさに私が望むものですが、問題は、保存ボタンを押すと、コントローラーの 2 番目の部分が使用されますが、「WrapperModel モデル」の値は空のリストです。Request 値では、すべてがコントローラーに送信されていることがわかりますが、WrapperModel では一致するものはありません。

「HardwareModel」の数が 0 または 99 になる可能性があるため、HardwareModel1、HardwareModel2 を作成できないため、どうすればよいかわかりません... web で読んだように。

私を助けてくれてありがとう、そして長い投稿でごめんなさい。

4

2 に答える 2

2

EditorTemplateを使用すると、うまくいきます。

EditorTemplatesというフォルダーを作成し、HardwareModel.cshtml という名前のビュー (editortemplate) を作成します。

ここに画像の説明を入力

次に、以下のコードをエディター テンプレート (新しいビュー) に追加します。必要に応じてレイアウトを更新できます。

@model HardwareModel           
<p>
 Name @Html.TextBoxFor(x => x.Name) <br />
 Desc : @Html.TextBoxFor(x => x.Description)
 @Html.HiddenFor(x => x.Id)
</p>

メイン ビューで、Html.EditorForHTML ヘルパー メソッドを使用して、このエディター テンプレートを呼び出します。

@model WrapperModel
@using (Html.BeginForm())
{       
  @Html.EditorFor(x=>x.HardwareList)
  <input type="submit" value="Save" />    
}

このような View に HardwareModels のリストを送信する GET アクションがあるとします。

public ActionResult Hardware()
{
    WrapperModel model = new WrapperModel();
    //HardCoded for demo.Can be replaced with entries based on your DB data
    model.HardwareList.Add(new HardwareModel { Id=1, Name = "Printer", 
                                                     Description = "desc" });
    model.HardwareList.Add(new HardwareModel { Id=2, Name = "Scanner",
                                                     Description = " desc2" });
    return View(model);
}

これで、HttpPost アクション メソッドは、フォーム送信時に子プロパティを取得します

[HttpPost]
public ActionResult Hardware(WrapperModel model)
{
    //check for  model.HardwareList Property here;
    return View(model);
}

ここに画像の説明を入力

ここで、あなたの質問に対処するために私が書いた実用的なサンプルをダウンロードできます。

于 2012-09-12T13:55:12.433 に答える
1

これは、この問題について私が読んだ中で最高の記事です。DotNetSlackers - ASP.NET MVC モデル バインディングについて

具体的には、クラス タイプのリストを使用したバインディングのセクションに興味があるかもしれません。

于 2012-09-12T13:48:21.393 に答える