2013-07-30 2 views
1

Я знаю, что отключенные входы не отправляют значение на сервер. Кроме того, флажок не может иметь свойство readonly. Я хотел бы получить функциональность «checkonly checkbox», где флажок отключен, и я могу прочитать значение этого флажка на странице.Значение по умолчанию отключено.

Следующий код - это что-то похожее на то, что мне нужно сделать в моем приложении. При щелчке первого флажка (RememberMe), я проверяю второй флажок (Серьезно) и добавляю к нему атрибут disable.

Вот модель:

public class LogOnModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [Display(Name = "Remember me?")] 
    public bool RememberMe { get; set; } 

    [Display(Name = "Seriously?")] 
    public bool Seriously { get; set; } 
} 

Вот мое мнение:

@using (Html.BeginForm("", "", FormMethod.Post, new { id = "userForm" })) 
{ 
<div> 
    <fieldset> 
     <legend>Account Information</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(m => m.UserName) 
     </div> 
     <div class="editor-field"> 
      @Html.TextBoxFor(m => m.UserName) 
      @Html.ValidationMessageFor(m => m.UserName) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(m => m.Password) 
     </div> 
     <div class="editor-field"> 
      @Html.PasswordFor(m => m.Password) 
      @Html.ValidationMessageFor(m => m.Password) 
     </div> 

     <div class="editor-label"> 
      @Html.CheckBoxFor(m => m.RememberMe) 
      @Html.LabelFor(m => m.RememberMe) 
     </div> 

     <div class="editor-label"> 
      @Html.CheckBoxFor(m => m.Seriously) 
      @Html.LabelFor(m => m.Seriously) 
     </div> 

     <p> 
      <input type="button" value="Log On" onclick = "SubmitForm();"/> 
     </p> 
    </fieldset> 
</div> 
} 

Вот раздели вниз содержимое моего файла JS включен в представлении:

function SubmitForm() { 
    $.ajax({ 
     type: "POST", 
     url: "/Account/LogOnAjax", 
     cache: false, 
     data: $("#userForm").serialize(), 
     success: function (results) { 
      showMessage(results); 
     }, 
     error: 
      showMessage("error!"); 
     } 
    }); 
} 

function SeriouslyCheckEnable(value) { 
    var SeriouslyCheckBox = $("input[name = 'Seriously']"); 
    if (value == "true") { 
     SeriouslyCheckBox.attr('checked', 'checked'); 
     SeriouslyCheckBox.attr("disabled", "true"); 
    } 
    else { 
     SeriouslyCheckBox.removeAttr('checked'); 
     SeriouslyCheckBox.removeAttr('disabled'); 
    } 
} 

$(document).ready(function() { 
    $("input[name='RememberMe']").click(function (e) { SeriouslyCheckEnable(($("input[name='RememberMe']:checked").val())); }); 
}); 

Вот контроллер, который я отлаживаю:

public ActionResult LogOnAjax(LogOnModel model) 
    { 
     bool seriously = model.Seriously; 
     bool remMe = model.RememberMe; 

     return Json("some message here", JsonRequestBehavior.AllowGet); 
    } 

Теперь, независимо от установленного состояния серьезного флажка, я всегда получаю ложное значение для булевой переменной. Любая помощь будет оценена по достоинству.

ответ

0

У меня возникло соблазн отметить ответ, предоставленный пользователем2395249, поскольку этот ответ привел меня в правильном направлении. Это, как я закончил с правильными значениями на пост AJAX:

Модель:

Я в основном добавил еще одно свойство под названием SeriouslyHidden.

[Display(Name = "Seriously?")] 
public bool Seriously { get; set; } 

public bool SeriouslyHidden { get; set; } 

Вид:

<div class="editor-label"> 
    @Html.HiddenFor(m => m.SeriouslyHidden) 
    @Html.CheckBoxFor(m => m.Seriously) 
    @Html.LabelFor(m => m.Seriously) 
</div> 

Модифицированный мой JavaScript следующим:

$(document).ready(function() { 
    $("input[name='RememberMe']").click(function (e) { 
     var RememberMeCheckBoxValue = ($("input[name='RememberMe']:checked").val()); 
     SeriouslyCheck(RememberMeCheckBoxValue); 
     SeriouslyDisable(RememberMeCheckBoxValue); 
    }); 

    $("input[name='Seriously']").click(function (e) { 
     SeriouslyCheck(($("input[name='Seriously']:checked").val())); 
    }); 
}); 

function SeriouslyCheck(value) { 
    $('#SeriouslyHidden').val(value); 
    if (value == "true") 
     $(SeriouslyCheckBox).attr('checked', 'checked'); 
    else 
     $(SeriouslyCheckBox).removeAttr('checked'); 
} 

function SeriouslyDisable(value) { 
    if (value == "true") 
     $(SeriouslyCheckBox).attr("disabled", "true"); 
    else 
     $(SeriouslyCheckBox).removeAttr('disabled'); 
} 

А затем в контроллере я извлекается значение из

public ActionResult LogOnAjax(LogOnModel model) 
{ 
    bool seriously = model.SeriouslyHidden; 
    bool remMe = model.RememberMe; 

    //do some processing here 

    return Json("some message here", JsonRequestBehavior.AllowGet); 
} 
2

Отключенные значения не будут опубликованы, как вы сказали. Если вы хотите использовать «отключенное» значение для целей показа, но выставлять скрытое значение, вам нужно будет создать дополнительное свойство специально для отображения.

МОДЕЛЬ

public class LogOnModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [Display(Name = "Remember me?")] 
    public bool RememberMe { get; set; } 

    public bool Seriously { get; set; } 

    [Display(Name = "Seriously?")] 
    public bool SeriouslyDisplay { get; set; } 
} 

HTML

<div class="editor-label"> 
    @Html.CheckBoxFor(m => m.SeriouslyDisplay) 
    @Html.LabelFor(m => m.SeriouslyDisplay) 
</div> 

@Html.HiddenFor(m => m.Seriously) 

JAVASCRIPT

function SeriouslyCheckEnable(value) { 
    $('#Seriously').val(value); 
    $('#SeriouslyDisplay').prop('checked', value); 
    $('#SeriouslyDisplay').prop('disabled', value); 
} 

Дисплей только собственно ty на самом деле не должно быть в модели дисплея, вам просто нужно поместить его в HTML. Я просто оставил его там для удобочитаемости.

Кроме того, я бы предложил использовать свойство 'checked' для переключения флажков с javascript, как в примере. Это делает его намного проще в использовании и чтении!

+0

мне нужен второй флажок для отключения только при первом флажке i s проверено. Я хочу, чтобы пользователи установили/сняли флажок, если первый флажок не установлен, и выведите соответствующее значение. В приведенном выше примере серьезный флажок всегда отключен. – TK1

+0

Кроме того, у меня появляется сообщение об ошибке javascript: «Объект не поддерживает свойство или метод« prop » – TK1

+0

Хорошо, я скорректировал его на основе требований, это было не на 100% ясным до этого, lemme знает, если это работает для вас. – JPK

Смежные вопросы