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
如果您正在創建一個需要下拉列表的查看和編輯表單,以下是一些建議和疑難解答。 我將從我需要的參數列表開始,以滿足我的需求。
- 在我看來,強烈的意見是可取的。 最小化魔術字符串。
- 視圖模型應該包含盡可能少的邏輯和外部元素。 只有工作應該是促進數據對象的集合。
- 下拉列表應顯示選定的值。
- 選擇的值應該很容易地映射回表單提交的視圖模型。
這可能聽起來像一個明顯的,容易獲得的列表,但對於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" />
}
}