Лучший способ отобразить группу / выбор радиокнопок из выбора одной радиокнопки? - PullRequest
0 голосов
/ 25 января 2011

У меня есть форма, которая по некоторым вопросам будет спрашивать, если что-то было включено, и если это не для того, чтобы указать причину.

Итак, мне нужна кнопка-переключатель, которая записывает в базу данных ее значение как нормальное, которое я настроил с помощью RadioButtonFor, и если выбрано «Нет» (false), тогда будет отображаться группа / список других радиокнопок.

Ofc, это просто идеальное решение, если этот метод неосуществим, тогда другим решением было бы, возможно, выражение if в контроллере, чтобы, если у этого основного переключателя было значение «Да» (true), оно установило бы Значения радиокнопок x, y и z равны «Нет» (false), когда он записывает форму в базу данных.

Это 2 идеи, которые у меня есть, о том, как получить тот же конечный результат, но для 1-й идеи я думаю, что самый простой способ выполнить эту функцию - это jquery, в котором я довольно новичок, так что было бы трудно придумать как это сделать

Для 2-й идеи это 1 не идеально, а 2, я не уверен, как бы я тогда ссылался на эти радиокнопки / код оператора if для выполнения указанной задачи.

Любые другие идеи также будут приветствоваться, но, надеюсь, с помощью о том, как их реализовать.

Ответы [ 3 ]

2 голосов
/ 26 января 2011

Ну, это может показаться излишним, но я бы выбрал оба решения. Вам нужен код на стороне сценария javascript, чтобы сделать это правильно с точки зрения представления, и вам также необходим код на стороне сервера для правильной проверки.

Если вы реализуете только проверку на стороне клиента, как будет вести себя система, если браузер не поддерживает javascript или она просто отключена? Вы не можете принимать поддержку JavaScript как должное ...

OTOH, вы бы предложили лучший пользовательский интерфейс, если бы добавили ту функциональность на стороне клиента, о которой вы говорите ...

И о ваших сомнениях в том, как выполнить проверку на стороне сервера: это легко сделать с ASP.NET MVC - при загрузке, просто установите то же свойство ViewData entry / 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, со значением по умолчанию "Blue". Обратите внимание, что для удобства мы назначаем отдельный идентификатор на стороне клиента для каждой радиопереключателя (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();
    }
});

Полагаю, так оно и было. Дайте мне знать, если я что-то пропустил ...: -)

2 голосов
/ 25 января 2011

Я бы пошел с вашим первым решением.Рендеринг обеих групп переключателей на странице, но скрыть вторую группу с помощью 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
}
0 голосов
/ 07 февраля 2011

Ну, я нашел самый простой способ заставить контроллер отсортировать проверку, которая была if (wd.AppTher == true) { wd.AppTherRea = 0; }, это пример выпадающего списка, а для другой радиопереключателя это будет вместо "0" или любого значения, которое вы хотите дляраскрывающийся список для того, чтобы он был "ложным" или если вы хотите / имеете несколько опций с int для типа поля db, тогда вы просто устанавливаете значение N / A или w / e как = тоже для нескольких RB или DDL, тогда простодобавьте больше между {и}, wd было значением, назначенным для представления таблицы, в противном случае можно использовать значение viewmodel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...