2011-01-25 161 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(); 
    } 
}); 

我想那就是它。讓我知道如果我錯過了什麼...... :-)