我正在尝试使用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>
希望有人会想出另一种方式。
答案 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();
}