drop down menu - validationstate - 如何使用視圖模型將選擇列表的選定值發佈到控制器?




validationstate react bootstrap (2)

這個問題已經以各種形式提出,但沒有一個答案似乎符合我的情況。 我只是試圖檢索我的控制器中的下拉列表中選定的值。

這是我的代碼:

ViewModel.cs

public class ViewModel
{
  public ViewModel() {}
  public ViewModel(Contact contact, IEnumerable<State> states)
    {
      this.Contact = contact;
      this.States = new SelectList(states, "Id", "Name", contact.StateId);
    }
  public Contact Contact {get;set;}
  public SelectList States {get;set;}
}

Controller.cs

[HttpPost]
public ActionResult Edit(ViewModel viewModel)
{
  _contactService.UpdateContact(viewModel.Contact);
  return RedirectToAction("Item", new {id = viewModel.Contact.Id});
}

View.cshtml

<button type="submit" onclick="javascript:document.update.submit()"><span>Update</span></button>//aesthic usage. 
@{using (Html.BeginForm("Edit", "Controller", FormMethod.Post, new { name = "update" }))
  {
   @Html.HiddenFor(m => m.Contact.Id)
   @Html.LabelFor(m => m.Contact.Name, "Name:")
   @Html.TextBoxFor(m => m.Contact.Name)

   <label for="state">State:</label>
   @Html.DropDownList("state", Model.States)
}
}

一切都按預期工作,除了在我的發布的viewModel傳遞到控制器的dropdownlist沒有值。 編輯頁面和所有字段加載正確。 下拉菜單正確綁定,正確顯示選定的值。 但是,當我發布我只有一個“聯繫”對像傳遞給控制器。 “States”SelectList對象為null。

我試圖在我的viewModel contstructor中映射“StateId”屬性,但這也沒有工作。 我究竟做錯了什麼?

謝謝。


嘗試使用@Html.DropDownListFor而不是,如果“狀態”是你的模型的一部分,你可以像這樣使用它:

@Html.DropDownListFor(m => m.Contact.StateId, Model.States, "-- Please select a State --")其中m.State保存選定的值。

也不要混淆IEnumerable與模型,我會把它放在ViewBag / ViewData中。

它會看起來像這樣:

@Html.DropDownListFor(m => m.Contact.StateId, (IEnumerable<string>)ViewBag.States, "-- Please select a State --")

而在你的動作返回這個視圖,你將需要初始化狀態枚舉ViewBag.States屬性。


我討厭回答自己的問題,但基於多個問題,加上無數的答案,我想我會總結我的發現。

首先感謝菲利普,他的回答並沒有完全解決我的問題,但它導致我在正確的方向。 +1

如果您正在創建一個需要下拉列表的查看和編輯表單,以下是一些建議和疑難解答。 我將從我需要的參數列表開始,以滿足我的需求。

  1. 在我看來,強烈的意見是可取的。 最小化魔術字符串。
  2. 視圖模型應該包含盡可能少的邏輯和外部元素。 只有工作應該是促進數據對象的集合。
  3. 下拉列表應顯示選定的值。
  4. 選擇的值應該很容易地映射回表單提交的視圖模型。

這可能聽起來像一個明顯的,容易獲得的列表,但對於MVC的新手,它不是。 我將從上面修改我的代碼和評論。 這是我做的。

ViewModel.cs

public class ViewModel
{
  public ViewModel() {}
  public ViewModel(Contact contact, IList<State> states)
  {
//no need to pass in a SelectList or IEnumerable, just what your service or repository spits out
    this.Contact = contact;
    this.States = states;
  }
  public Contact Contact {get;set;}
  public IList<State> States {get;set;}
}

Controller.cs //和上面沒什麼區別

public ActionResult Edit(int id)
{
  var contact = _contactService.GetContactById(id);
  var states = _stateService.GetAllStates();
  return View(new ViewModel(contact, states));
}

public ActionResult Edit(ViewModel viewModel)
{
  _contactService.UpdateContact(viewModel.Contact);
  return RedirectToAction("Edit", new {id = viewModel.Contact.Id });
}

查看//感謝Artirto在這篇文章

@{using (Html.BeginForm("Edit", "Controller", FormMethod.Post))
 {
  @Html.HiddenFor(m => m.Contact.Id)
  @Html.DropDownListFor(m => m.Contact.StateId, new SelectList(Model.States, "Id", "Name", @Model.Contact.StateId))
<input type="submit" value="Save" />
}
}