2011-01-25 113 views
0

我有一个表单,对于某些问题会询问是否包含某些内容,以及是否不提供原因。从单个单选按钮的选择中显示组/选择单选按钮的最佳方法?

所以我需要一个单选按钮,它向数据库记录它的值,就像我用RadioButtonFor设置的正常值一样,如果选择“否”(false),则会显示其他单选按钮的组/列表。

Ofc这只是理想的解决方案,如果这种方法不可行,那么另一种解决方案可能是在控制器中使用if语句,以便如果该主要单选按钮的值为“是”(true),那么它会将表单记录到数据库时,将x,y和z单选按钮的值设置为“否”(false)。

这些是我有关于如何得到相同的最终结果,但对于第一个想法的2个想法我认为最简单的方法来执行它的功能将在jquery中,我很新,所以很难上来与如何去做

对于第二个想法它是1不理想,2我不知道如何然后引用那些单选按钮/代码if语句来执行所述任务。

任何其他的想法也将受到欢迎,但希望在如何实施它们的帮助。

+1

我真的无法理解,因为你几乎没有使用任何标点符号,如果你能修正它,看看我的意思是什么会更好。 – rsenna 2011-01-25 15:06:41

+0

@rsenna我所能做的只是空间出来,所以我希望这是更好的 – Myzifer 2011-01-25 15:14:31

+0

@rsenna:所以任何想法或解决方案? – Myzifer 2011-01-26 10:18:54

回答

-4

那么我想出了最简单的方法来让控制器整理验证是 if (wd.AppTher == true) { wd.AppTherRea = 0; }这是一个下拉和另一个单选按钮的示例它会代替“0”或任何值你想要的下拉为“假”,或者如果你想/有多个选项,在db字段类型的int,那么你只需设置你的N/A或W/e值也是=,对于多个RB或DDL,则只需在{和}之间添加更多,wd是分配给表的值,否则可以使用视图模型值。

2

我会去你的第一个解决方案。渲染页面上的两组单选按钮,但用css隐藏第二组。然后在第一组的单选按钮上设置一些onclick事件,以显示/隐藏第二组,取决于哪一个被点击。

我认为只需手动为单选按钮编写html是因为您正在编写的onclick处理程序,但您也可以使用RadioButtonFor来管理它。

所以,你是/否是这样的:

<input type="radio" name="yesNo" id="yes" onlclick="$('#other-options').hide();' value='true' <%: Model.YesNo ? "checked='checked'" : "" %>/><label for='yes'>Yes</label> 
<input type="radio" name="yesNo" id="no" onlclick="$('#other-options').show();' value='false'<%: !Model.YesNo ? "checked='checked'" : "" %>/><label for='no'>No</label> 

你的其他选择是这样的:如果

<div id='otherOptions' <%: Model.YesNo ? "style='display: none;'" : "" %>> 
    <input type="radio" name="XYesNo" id="xyes" value='true'/><label for='xyes'>X Yes</label> 
    <input type="radio" name="XYesNo" id="xno" value='false'/><label for='xno'>X No</label> 
    <input type="radio" name="YYesNo" id="yyes" value='true'/><label for='yyes'>Y Yes</label> 
    <input type="radio" name="YYesNo" id="yno" value='false'/><label for='yno'>Y No</label> 
    <input type="radio" name="ZYesNo" id="zyes" value='true'/><label for='zyes'>Z Yes</label> 
    <input type="radio" name="ZYesNo" id="zno" value='false'/><label for='zno'>Z No</label> 
</div> 

在动作方法忽略任何X,Y,Z值第一YESNO是真实的:

if(model.YesNo){ 
    //persist false values for x,y,z 
} else { 
    //check model for values of x,y,z 
} 
2

嗯,这听起来可能矫枉过正,但我​​会用b移动到其他解决方案。您需要JavaScript脚本代码才能从演示的角度来完成它 - 而且您还需要服务器端代码来执行验证。

如果您只实现客户端验证,如果浏览器不支持JavaScript,或者只是被禁用,系统将如何运行?你不能把JavaScript的支持是理所当然的......

OTOH,你会提供最佳的用户体验,如果你补充说,客户端功能你在谈论...

以及您的疑问如何进行服务器端验证:使用ASP.NET MVC很容易 - 在加载时,只需设置您在发布期间阅读的相同ViewData条目/ ViewModel属性即可。

编辑让我们来谈谈一个完整的解决方案。

再次,我不知道我明白你在这里需要什么。你在谈论单选按钮,但你似乎也认为你可以单独控制它们(许多无线电装置绑定到很多领域)。通常情况下,一组单选按钮通常绑定到相同的字段,每个单选按钮的含义不同(如同单个下拉列表一样)。当然,这并不能意思你的数据库的行为必须以同样的方式...

见这个例子:

<% using(Html.BeginForm("HandleForm", "Home")) { %> 
    Select your favorite color:<br /> 
    <%= Html.RadioButton("favColor", "Blue", true, new { id = "rbColorBlue", class = "favColor" }) %> Blue <br /> 
    <%= Html.RadioButton("favColor", "Purple", false, new { id = "rbColorPurple", class = "favColor" })%> Purple <br /> 
    <%= Html.RadioButton("favColor", "Red", false, new { id = "rbColorRed", class = "favColor" })%> Red <br /> 
    <%= Html.RadioButton("favColor", "Orange", false, new { id = "rbColorOrange", class = "favColor" })%> Orange <br /> 
    <%= Html.RadioButton("favColor", "Yellow", false, new { id = "rbColorYellow", class = "favColor" })%> Yellow <br /> 
    <%= Html.RadioButton("favColor", "Brown", false, new { id = "rbColorBrown", class = "favColor" })%> Brown <br /> 
    <%= Html.RadioButton("favColor", "Green", false, new { id = "rbColorGreen", class = "favColor" })%> Green 
    <%= Html.RadioButton("favColor", "Other", false, new { id = "rbColorOther", class = "favColor" })%> Other 
    <div id="divOtherColorText" style="display: block"> 
     Describe the color you want here:<br /> 
     <%=Html.TextArea("otherColorText", new { id = "taOtherColor" }) %><br /> 
    </div> 
<% } %> 

这将绑定到单个控制器参数,favColor,具有缺省值“蓝色”。看到这一点,为了方便起见,我们为每个单选按钮分配一个不同的客户端ID(rbColorBlue,rbColorGreen等等)。这意味着即使它们代表服务器端控制器的单个值,您也可以在jQuery代码中单独处理每个单选按钮。

谈到服务器端代码,这是该行动将如何看起来像:

public class HomeController : Controller 
{ 
    public ActionResult HandleForm(string favColor, string otherColorText) 
    { 
     // Add action logic here 
     // If you want to have a separated field for your database, 
     // just do something like that: 
     MyDbFacade.BlueColorField = (favColor == "Blue"); 
     MyDbFacade.GreenColorField = (favColor == "Green"); 
     ... 

     return View(); 
    } 

} 

(当然,你也可以使用一个ViewModel工作,但我不会谈论这个选项在这里。 )

回到客户端。假设您不想显示taOtherColor,除非用户选择rbColorOther单选按钮。 jQuery代码会是这样的:

$(document).ready(function() { 
    // If user selects any radiobutton: 
    if ($('#rbColorOther:checked').length > 0) { 
     $("#divOtherColorText").show(); 
    } else { 
     $("#divOtherColorText").hide(); 
    } 
}); 

我想那就是它。让我知道如果我错过了什么...... :-)