Ответ 1
Если вы укажете радиокнопкам то же имя, что и свойство на вашей модели, тогда MVC автоматически установит атрибут checked на соответствующей кнопке.
Я думаю, что это зависит от наличия сильно типизированной модели.
Я пытаюсь использовать asp.net mvc для нового проекта, и я столкнулся с чем-то странным. Когда я использую помощники MVC UI для текстовых полей, значения сохраняются между вызовами. Но, когда я использую серию переключателей, проверенное состояние не сохраняется.
Вот пример из моего представления.
<li>
<%=Html.RadioButton("providerType","1")%><label>Hospital</label>
<%=Html.RadioButton("providerType","2")%><label>Facility</label>
<%=Html.RadioButton("providerType","3")%><label>Physician</label>
</li>
Когда форма отправляется назад, я создаю объект с "ProviderType" как один из его свойств. Значение объекта устанавливается, а затем я RedirectToAction с поставщиком в качестве аргумента. Все хорошо, и я заканчиваю URL-адресом типа http://localhost/Provider/List?ProviderType=1 с показателем ProviderType. Значение сохраняется в URL-адресе, но вспомогательный пользовательский интерфейс не поднимает проверенное состояние.
У меня возникает эта проблема со списком, dropdownlist и радиобутом. Текстовые поля отлично подбирают значения. Вы видите что-то, что я делаю неправильно? Я предполагаю, что помощники сделают это для меня, но, возможно, мне просто придется позаботиться об этом самостоятельно. Я просто чувствую свой путь через это, поэтому ваш вклад приветствуется.
Изменить: Я только что нашел переопределение для конструктора SelectList, который принимает выбранное значение. Это позаботилось о моем выпуске, о котором я упоминал выше.
Изменить # 2: Я нашел что-то, что работает, но мне больно это делать. Я чувствую, что это должно быть выведено.
<li>
<%=Html.RadioButton("ProviderType","1",Request["ProviderType"]=="1")%><label>Hospital</label>
<%=Html.RadioButton("ProviderType", "2", Request["ProviderType"] == "2")%><label>Facility</label>
<%=Html.RadioButton("ProviderType", "3", Request["ProviderType"] == "3")%><label>Physician</label>
</li>
Надеюсь, кто-то придумает другой способ.
Если вы укажете радиокнопкам то же имя, что и свойство на вашей модели, тогда MVC автоматически установит атрибут checked на соответствующей кнопке.
Я думаю, что это зависит от наличия сильно типизированной модели.
В вашем представлении вам будет что-то вроде этого:
<% foreach(var provider in (IEnumerable<Provider>)ViewData["Providers"]) { %>
<%=Html.RadioButton("ProviderType", provider.ID.ToString(), provider.IsSelected)%><label><%=provider.Name%></label>
<% } %>
И тогда у вашего контроллера есть это:
var providers = GetProviders();
int selectedId = (int) Request["ProviderType"]; // TODO: Use Int32.TryParse() instead
foreach(var p in providers)
{
if (p.ID == selectedId)
{
p.IsSelected = true;
break;
}
}
ViewData["Providers"] = providers;
return View();
Класс Provider будет выглядеть примерно так:
public class Provider
{
public int ID { get; set; }
public string Name { get; set; }
public bool IsSelected { get; set; }
}
Форма не должна размещаться в строке запроса, если вы не забыли указать форму как метод = "POST". Как вы указываете форму? Вы используете бета-версию ASP.NET MVC?
Сейчас я использую vs2010, он работает как:
<%=Html.RadioButton("ProviderType","1",Model.ProviderType==1)%><label>Hospital</label>
выглядит лучше?
Ну логично, что это не будет сохраняться, нет состояния сеанса. Подумайте об этом как о совершенно новой странице. Чтобы ваши радиокнопки были заполнены, вам нужно сохранить что-то вроде ViewData [ "ProviderType" ] = 3, чтобы радиообъект заполнил своими данными.
Я сделал это расширение HTML-помощника:
<Extension()> _
Public Function RadioButtonList(ByVal helper As HtmlHelper, ByVal name As String, ByVal Items As IEnumerable(Of String)) As String
Dim selectList = New SelectList(Items)
Return helper.RadioButtonList(name, selectList)
End Function
<Extension()> _
Public Function RadioButtonList(ByVal helper As HtmlHelper, ByVal Name As String, ByVal Items As IEnumerable(Of SelectListItem)) As String
Dim sb As New StringBuilder
sb.Append("<table class=""radiobuttonlist"">")
For Each item In Items
sb.AppendFormat("<tr><td><input id=""{0}_{1}"" name=""{0}"" type=""radio"" value=""{1}"" {2} /><label for=""{0}_{1}"" id=""{0}_{1}_Label"">{3}</label></td><tr>", Name, item.Value, If(item.Selected, "selected", ""), item.Text)
Next
sb.Append("</table>")
Return sb.ToString()
End Function
Тогда в представлении:
<%= Html.RadioButtonList("ProviderType", Model.ProviderTypeSelectList) %>
В контроллере опция автоматически сопоставляется с использованием стандарта:
UpdateModel(Provider)
Работает как шарм. Если вы являетесь tablephobic, измените сгенерированную разметку.
Вид:
<%=Html.RadioButton("providerType","1")%><label>Hospital</label>
<%=Html.RadioButton("providerType","2")%><label>Facility</label>
<%=Html.RadioButton("providerType","3")%><label>Physician</label>
Контроллер:
public ActionResult GetType(FormCollection collection)
{
string type=collection.Get("providerType");
if(type=="1")
//code
else if(type=="2")
//code
else
//code
return View();
}