asp.net mvc单选按钮状态

时间:2008-11-04 20:38:11

标签: asp.net-mvc ui-helper

我正在尝试使用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与提供程序一起作为参数。一切都很好,我最终得到了一个像“http://localhost/Provider/List?ProviderType=1”这样的URL,其中显示了ProviderType。该值将持久保存到URL,但UI帮助程序未获取已检查状态。

我遇到了listbox,下拉列表和radiobutton这个问题。文本框可以很好地获取值。你看到我做错了吗?我假设帮助者会为我做这件事,但也许我只需要自己照顾这个。我只是感觉自己的方式,所以你的意见得到了赞赏。

编辑:我刚刚找到了采用所选值的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 个答案:

答案 0 :(得分:6)

如果给单选按钮的名称与模型上的属性相同,则MVC将自动在相应的按钮上设置checked属性。

我认为这依赖于强类型模型。

答案 1 :(得分:3)

在您看来,您需要的是这样的东西:

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

答案 2 :(得分:1)

除非您忘记将表单指定为method =“POST”,否则不应将表单发布到查询字符串。你是如何指定表格的?您使用的是ASP.NET MVC Beta吗?

答案 3 :(得分:1)

我现在正在使用vs2010,它的工作原理如下:

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

看起来更好?

答案 4 :(得分:0)

逻辑上它不会持续存在,没有会话状态。把它想象成一个全新的页面。为了让你的单选按钮填充,你需要保留像ViewData [“ProviderType”] = 3这样的东西,让radiobutton重新填充其数据。

答案 5 :(得分:0)

我已经制作了这个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)

像魅力一样工作。如果您是桌面恐惧症,请更改生成的标记。

答案 6 :(得分:-1)

查看:

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