Включение / отключение проверки некоторых скрытых текстовых полей в mvc 2

У меня есть кнопки ввода [скрыть] и [показать], кнопка скрыть показывает некоторые текстовые поля, а скрытая кнопка скрывает некоторые текстовые поля. Я хочу включить проверку только для тех полей, которые видны, и отключить проверку для ящики, которые не видны клиенту. В настоящее время я проверяю все поля, действие публикации также проверяет текстовые поля, которые скрыты с помощью jquery, ниже приведен код:

Вид

<script type="text/javascript">

$(document).ready(function () {
    var $startdates = $('#startDates');
    var $endDates = $('#endDates');
    var $showEvents = $('#showEvents');
    $startdates.hide();
    $endDates.hide();
    $showEvents.hide();

    $('#all').click(function () {
        $startdates.show();
        $endDates.show();
        $('#showEvents').show();
        $('#eventdids').hide();
        $(this).hide();
        return false;

    });

    $('#showEvents').click(function () {
        $startdates.hide();
        $endDates.hide();

        $('#eventdids').show();
        $('#all').show();
        $(this).hide();
        return false;

    });
});
 </script>
<tr id="startDates">
        <td>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.StartDate) %>
        </div>
        </td>
        <td>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.StartDate) %>
            <%: Html.ValidationMessageFor(model => model.StartDate) %>
        </div>
        </td>
        </tr>

        <tr id="endDates">
        <td>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.EndDate) %>
        </div>
        </td>
        <td>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.EndDate) %>
            <%: Html.ValidationMessageFor(model => model.EndDate) %>
        </div>
        </td>
        </tr>


        <tr id="eventdids">
        <td>
        <label>Events</label>
        </td>
        <td>
         <% foreach (var item in (SelectList)ViewData["events"]) { %>
                 <input type="checkbox" name="Name" value="<%=item.Value %>" />
                  <label for="<%=item.Value%>"><%=item.Text%></label>
                  <br />

        <% } %> 

        </td>
        <td><input type="button" name="Select" id="all" style="width:auto" value="Hide" /></td>


        </tr>

        </table>
      <input type="button" name="show" id="showEvents" style="width:auto" value="Show" />

        <p>
            <input type="submit" value="Create" />
        </p>

Контроллер:

 [HttpPost]
    public ActionResult Create(FormCollection collection, int[] Name)
    {

        IVoucherRepository voucherResp = new VoucherRepository();
            string empty = "";
            if (Name != null)
            {
                for (int i = 0; i < Name.Length; i++)
                {
                    empty += Convert.ToString(Name[i]) + ",";
                }

            }
            else
            {
                ModelState.AddModelError("Venue", "Required");

            }
            if (Convert.ToBoolean(collection["pound"].ToLower().StartsWith("false")) && Convert.ToBoolean(collection["percentage"].ToLower().StartsWith("false")))
            {
                ModelState.AddModelError("","Please Select £ or % for discount");
            }
            if (collection["UsageQtyAvailable"] == null) { ModelState.AddModelError("UsageQtyLeft", "Required "); }

            Voucher voucher = new Voucher();
            if (TryUpdateModel(voucher) && ModelState.IsValid)
            {
                voucher.Status = true;
                voucher.DateAdded = DateTime.Now;
                voucher.DateModified = DateTime.Now;
                if(Convert.ToBoolean(collection["pound"].ToLower().StartsWith("true")))
                {
                voucher.DiscountType = 1;
                }
                else if (Convert.ToBoolean(collection["percentage"].ToLower().StartsWith("true")))
                {
                    voucher.DiscountType = 2;
                }
                voucher.VoucherType = 1; //Discount Code
                voucher.UsageQtyLeft = Convert.ToInt32(collection["UsageQtyAvailable"]);
                string removeComma = empty.Remove(empty.Length - 1,1);
                voucher.EventIDs = removeComma;
                voucherResp.Add(voucher);
                voucherResp.Save();
                return RedirectToAction("Index");
            }

            ITrackdayRepository trackdayResp = new TrackdayRepository();
            IQueryable<Object> getAllEvents = trackdayResp.GetEventsSelectlist();

            ViewData["events"] = new SelectList(getAllEvents.ToList(), "EventID", "Name");
            return View();

    }

person Mr A    schedule 08.08.2011    source источник


Ответы (2)


Вы можете проверить с помощью jquery, скрыты ли текстовые поля, и удалить их перед отправкой формы, а затем проверять только отправленные элементы формы.

...
<input type="submit" value="Create" id="create" />
...

$("#create").click(function() { 
        $('#eventdids:hidden').remove();
        $('#all:hidden').remove();
    $("#formID").submit(); 
});
person Nicholas Murray    schedule 08.08.2011

Вы также можете удалить проверку всех скрытых полей в форме с помощью этого небольшого плагина:

(function($) {
    $.fn.refreshValidator = function() {
        var form = this;

        // Get validation settings object
        var settings = form.validate().settings;

        // Remove validation for hidden elements
        $(this).find(':hidden').each(function(){
            var id = $(this).attr('id');
            delete settings.rules[id];
            delete settings.messages[id];
        });
    };
})(jQuery);

Вы можете назвать это так:

$('#yourFormId').refreshValidator();

Таким образом, он более пригоден для повторного использования.

person Robin van der Knaap    schedule 08.08.2011