1

作成してビューに渡すモデルがあります。モデルはフォームを作成し、HttpPost属性を使用してモデルを取得します。モデルをデータベースに保存してから、デフォルトのモデル状態をビューに戻したい (IE ドロップダウン値、ただし選択された項目ではない)

空のモデルを作成し、これをビューに渡しましたが、値は同じままで、理由がわかりません。

私の見解

 @using (Html.BeginForm())
  {
    @Html.ValidationSummary(true)
    <fieldset>
      <legend>
        <h2>Configuration settings</h2>
      </legend>

      <div class="editor-label">
        @Html.LabelFor(model => model.DeviceType)
      </div>
      <div class="editor-field">
        @Html.DropDownListFor(model => model.DeviceTypeSelectedItem, new SelectList(Model.DeviceType, "Value", "Text"),new {@class = "DeviceTypeDDL"})
        @Html.ValidationMessageFor(model => model.DeviceTypeSelectedItem)
      </div>

       <div class="editor-label">
        @Html.LabelFor(model => model.ConfigGroup)
      </div>
      <div class="editor-field">
        @Html.DropDownListFor(model => model.ConfigGroupSelectedItem, new SelectList(Model.ConfigGroup, "Value", "Text"),new {@class = "ConfigGroupDDL"})
        @Html.ValidationMessageFor(model => model.ConfigGroupSelectedItem)
      </div>

       <div class="editor-label">
        @Html.LabelFor(model => model.ConfigName)
      </div>
      <div class="editor-field">
        @Html.DropDownListFor(model => model.ConfigNameSelectedItem, new SelectList(Model.ConfigName, "Value", "Text"),new {@class = "ConfigNameDDL"})
        @Html.ValidationMessageFor(model => model.ConfigNameSelectedItem)
      </div>

        <div class="editor-label">
        @Html.LabelFor(model => model.ConfigValue)
      </div>
      <div class="editor-field">
        @Html.EditorFor(model => model.ConfigValue)
        @Html.ValidationMessageFor(model => model.ConfigValue)
      </div>

        <div class="editor-label">
        @Html.LabelFor(model => model.MergeOrDelete)
      </div>
      <div class="editor-field">
        @Html.DropDownListFor(model => model.MergeOrDeleteSelectedItem, new SelectList(Model.MergeOrDelete, "Value", "Text"), new { @class = "MergeDeleteDDL" })
        @Html.ValidationMessageFor(model => model.MergeOrDeleteSelectedItem)
      </div>

      @Html.HiddenFor(model => model.ManagementGroupId)

      <p>
        <input type="submit" value="Add" />
      </p>
    </fieldset>
  }

コントローラ:

[HttpGet]
    public ActionResult Index(int id)
    {
      var model = CreateDefaultConfigModel(id);
      return View(model);
    }
    [HttpPost]
    public ActionResult Index(vmConfiguration model)
    {
      if (ModelState.IsValid)
      {
        bool isMerge = model.MergeOrDeleteSelectedItem == 1 ? true : false;
        _configLogic.AddConfigurationValue((int)model.ConfigNameSelectedItem, (int)model.ManagementGroupId, model.ConfigValue, isMerge);
        return View(CreateDefaultConfigModel(model.ManagementGroupId));
      }
      else
      {
        return View(model);
      }
    }
private vmConfiguration CreateDefaultConfigModel(int id)
{
  var model = new vmConfiguration
  {
    DeviceType = _configLogic.GetDevices,
    ConfigGroup = new List<SelectListItem>() { EmptySelect() },
    ConfigName = new List<SelectListItem>() { EmptySelect() },
    ConfigGroupSelectedItem = null,
    MergeOrDeleteSelectedItem = null,
    DeviceTypeSelectedItem = null,
    ConfigNameSelectedItem = null,
    ManagementGroupId = id,
    ParamData = _configLogic.GetParamValuesForGroup(id)
  };
  return model;
}
private static SelectListItem EmptySelect()
{
  return new SelectListItem { Text = "No value", Value = "-1" };
}
private ConfigurationLogic _configLogic;

調査の結果this.ModelState.Clear();、新しいモデルを作成する前に呼び出すと機能することがわかりましたが、MVC が渡したモデルを無視してバインドされたモデルを使用するのはなぜですか?

4

1 に答える 1

3

変化する

return View(CreateDefaultConfigModel(model.ManagementGroupId));

これに

return RedirectToAction("Index", new { id = model.ManagementGroupId });

モデルを無視しているのではなく、同じインデックスページにフォームを送り返すときにフォームに記入しようとしています。 -すべての情報をもう一度入力してください。この情報はすべて ModelState に格納されます。これは、サーバーに戻された試行済みの値が保持されているためです。とにかく、投稿が成功した後にリダイレクトすることが推奨されるパターンです。PRG パターンを検索する

于 2013-02-27T22:22:18.807 に答える