Подтвердить что ты не робот

Состояние радиостанции asp.net mvc

Я пытаюсь использовать 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>

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

4b9b3361

Ответ 1

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

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

Ответ 2

В вашем представлении вам будет что-то вроде этого:

<% 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; }
}

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

Я сделал это расширение 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, измените сгенерированную разметку.

Ответ 7

Вид:

<%=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();
}