2

MVC3 を使用して、SelectList の選択された値を設定すると、HttpGet ではビューが正しくレンダリングされるが、HttpPost では正しくレンダリングされないことがわかりました。HttpPost のビューに転送される前にモデルを検査しましたが、正しく更新されています。ビューが選択したタグを正しくレンダリングしていないようです。

HttpPost では、<select>編集後、フォームの送信前とまったく同じようにレンダリングされます。m.SelectedWidgetId = 2;HttpPost メソッド内の が実行され、モデルが更新されますが、View には反映されません。

ここで何が欠けていますか?

モデル:

public class WidgetModel
{
    private Widget[] Widgets {
        get
        {
            return new Widget[] { 
                new Widget { Id=1, Name="Item 1" },
                new Widget { Id=2, Name="Item 2" },
                new Widget { Id=3, Name="Item 3" }
            };
        }
    }
    public SelectList WidgetList
    {
        get
        {
            return new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId);
        }
    }
    public int SelectedWidgetId { get; set; }
}

意見:

@model thisProject.Models.WidgetModel

@using (Html.BeginForm())
{
    @Html.DropDownListFor(m => m.SelectedWidgetId, Model.WidgetList, "Select...");      
    <input type='submit' />                                                                                    
}

コントローラ メソッド;

public ActionResult Widget()
{
    var m = new WidgetModel();
    m.SelectedWidgetId = 1;
    return View(m);
}
[HttpPost]
public ActionResult Widget(WidgetModel m)
{
    m.SelectedWidgetId = 2;
    return View(m);
}
4

2 に答える 2

3

これは、HTMLヘルパーが値をレンダリングするときに、モデル内の値よりも前にリクエスト内の値を常に使用するために発生します。これは基本的に、POSTアクションの値を変更する場合は、最初にモデルの状態からその値を削除する必要があることを意味します。

[HttpPost]
public ActionResult Widget(WidgetModel m)
{
    ModelState.Remove("SelectedWidgetId");
    m.SelectedWidgetId = 2;
    return View(m);
}

または、ヘルパーは手動で設定している値を単に無視し、ユーザーによってPOSTされた値を使用します。

于 2011-05-05T06:24:32.413 に答える
2

asp.net mvcでは、selectListのselectedvalueは、厳密に型指定されたヘルパーを使用するときにドロップダウンが作成されるプロパティの値によってオーバーライドされます。

<%:Html.DropDownListFor(x=>x.SelectedWidgetID, ---,----)%>

この場合、Model.selectedwidgetIDの値は、で設定されている値をオーバーライドします。

new SelectList(Widgets.ToList(), "Id", "Name", SelectedWidgetId);
于 2011-05-05T06:23:36.537 に答える