Состояние переключателя asp.net mvc - PullRequest
12 голосов
/ 04 ноября 2008

Я пробую 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-адресе, но помощник пользовательского интерфейса не получает проверенное состояние.

У меня проблема со списком, выпадающим списком и кнопкой радио. Текстовые поля подбирают значения просто отлично. Вы видите что-то, что я делаю не так? Я предполагаю, что помощники сделают это для меня, но, возможно, мне просто придется позаботиться об этом самостоятельно. Я просто чувствую свой путь через это, поэтому ваш вклад приветствуется.

Редактировать: Я только что нашел переопределение для конструктора 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>

Надеюсь, кто-нибудь придумает другой путь.

Ответы [ 7 ]

6 голосов
/ 04 августа 2009

Если вы присвоите переключателям то же имя, что и свойство вашей модели, то MVC автоматически установит отмеченный атрибут на соответствующую кнопку.

Я думаю, это зависит от наличия строго типизированной Модели.

3 голосов
/ 08 марта 2009

Что вам нужно, так это, по вашему мнению:

<% 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; }
}
1 голос
/ 07 июня 2010

Я использую vs2010 сейчас, он работает как:

<%=Html.RadioButton("ProviderType","1",Model.ProviderType==1)%><label>Hospital</label> 

выглядит лучше?

1 голос
/ 05 ноября 2008

Форма не должна отправляться в строку запроса, если вы не забыли указать форму как method = "POST". Как вы указываете форму? Вы используете ASP.NET MVC Beta?

0 голосов
/ 12 января 2011

Я сделал это расширение HTML Helper:

    <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)

Работает как шарм. Если вы заядлый человек, измените созданную разметку.

0 голосов
/ 11 декабря 2010

Вид:

<%=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();
}
0 голосов
/ 12 февраля 2009

Ну, по логике это не будет сохраняться, нет состояния сеанса. Думайте об этом как о совершенно новой странице. Для того, чтобы ваши радио-кнопки были заполнены, вам нужно сохранить что-то вроде ViewData ["ProviderType"] = 3, чтобы радио-кнопка снова заполнилась данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...