То, что вам нужно, не должно быть таким сложным, как ваше объяснение.Для начала в вашей модели вам не нужно будет указывать список состояний.Таким образом, в вашей модели вы должны иметь
public String State { get; set; }
Тогда, по вашему мнению - при условии, что у вас есть строго типизированное представление в AddressList, у вас есть следующее для состояния
<div class="editor-label">
<%: Html.Label("State") %>
</div>
<div class="editor-field">
<%= Html.DropDownList(
"State",
new SelectList(Html.StateDropDownList(HttpContext.Current), "State",
"State", Model.State != null ? Model.State : null),
new { id = "State", width = "80px" })
%>
</div>
<div>
<div>
Обратите внимание на моеметод расширения StateDropDownList, который можно реализовать следующим образом;вот где может быть вещь Ioc / DI:
public static IEnumerable<State> StateDropDownList(this HtmlHelper htmlHelper, HttpContextBase current)
{
var stateList = current.Application.Get(Constants.General.StateNames) as IEnumerable<State>;
if (stateList == null)
{
var stateService = ((IIocContainer)current.Application["container"]).Resolve<IStateService>();
stateList = stateService.GetStates();
current.Application.Set(Constants.General.StateNames, stateList);
}
return stateList;
}
Примечание: IIocContainer можно заменить на конкретный тип или тип интерфейса для используемого Ioc.Кроме того, я не использовал StateID, потому что вы на самом деле использовали значение State (строку) в своей модели AddressList, однако я считаю, что использование StateID может быть лучше, и раскрывающийся список изменится на:
<div class="editor-label">
<%: Html.Label("State Name") %>
</div>
<div class="editor-field">
<%= Html.DropDownList(
"StateID",
new SelectList(Html.StateDropDownList(HttpContext.Current), "StateID",
"State", Model.StateID != null ? Model.StateID : null),
new { id = "StateID", width = "80px" })
%>
</div>
<div>
<div>
Я полагаю, что большинство ваших вопросов, должно быть, ответили на вышеприведенные вопросы, но если нет, позвольте мне сейчас ответить на следующие вопросы:
«Кто несет ответственность за заполнение списка состояний? Должен ли контроллер делать это?если в него была вставлена служба для получения состояний? Если да, то входит ли эта же логика внедрения и заполнения в каждый из моих контроллеров, которым нужно заполнить адрес? Или это должно идти куда-то еще? "
- В идеале этот список должен быть в вашем хранилище данных как часть справочных данных.Таким образом, каждый раз, когда вам нужен список, вы можете использовать метод расширения StateDropDownList, чтобы получить его, а затем привязать к раскрывающемуся списку, как я изложил выше.Поскольку этот список можно использовать во многих местах, вам не нужно помещать поиск в конкретный контроллер.