Пометьте поле как требуется «на лету» - PullRequest
5 голосов
/ 12 декабря 2011

Использование ASP.NET MVC3, Razor и jQuery Ненавязчивая проверка (как предусмотрено Microsoft "из коробки").

Как можно пометить поля как обязательные «на лету», т. Е. Только при определенных обстоятельствах? Например, если пользователь в роли «издатель», есть кнопки «Дата публикации» и «Публикация». Поле «Дата публикации» является обязательным при нажатии кнопки «Опубликовать», но не при нажатии кнопки «Сохранить черновик». Если пользователь не в этой роли, то кнопка «Опубликовать» не отображается в форме и, следовательно, не требуется.

Я уверен, что это не то, что можно сделать из коробки, и требуется дополнительный код как на стороне клиента (проверка jQuery), так и на стороне сервера. Если это возможно, не очевидно, как это можно сделать.

Ответы [ 3 ]

1 голос
/ 12 декабря 2011

Если бы вы делали это в webform-land, вы бы создали экземпляр RequiredFieldValidator в обработчике события нажатия кнопки и применили его к полю, которое должно стать обязательным.

В mvc-land это не очевидно. Этот SO вопрос / ответ демонстрирует, как обрабатывать нажатие кнопки - вы можете расширить его, чтобы создать экземпляр RequiredFieldValidator и применить его к полю.

В jquery вы можете добавить что-то вроде:

$("#buttonid").on("click", function() { $("#fieldToBeRequiredId").rules("add", {
 required: true  }); }
0 голосов
/ 24 августа 2015

Я объясню идею в коротком примере.У нас есть флажок «IsMasterProject», который необходимо установить для поля «MasterProjectNo»:

Чтобы выполнить необходимое «на лету», вам необходимы следующие вещи:

Определите вашу модель с помощью поля, это не является строгим [Обязательно]

class ProjectList {

    public bool IsMasterProject { get; set; }

    // this field will be optionally required, 
    // we do not need the [Required] attribute
    public string MasterProjectNo { get; set; } 

}

Создайте представление с примером кода поля:

<div class="data-field">
    <div class="editor-label">
        <div id="IsMasterProjectLabel">
            Is Master Project
        </div>
    </div>
    <div class="editor-field">
        <input id="IsMasterProject" class="check-box" type="checkbox" value="true" name="IsMasterProject" data-val-required="The IsMasterProject field is required." data-val="true" checked="checked">
    </div>
</div>

<div class="data-field">
    <div class="editor-label">
        <div id="MasterProjectNoLabel">
            Master Project No
        </div>
    </div>
    <div class="editor-field">
        <input id="MasterProjectNo" type="text" value="" title="" style="width: 9.2em" placeholder="" name="MasterProjectNo" maxlength="15" data-val-length-max="15" data-val-length="The field MasterProjectNo must be a string with a maximum length of 15." data-val="true">
    </div>
</div>

Добавьте Java Script для обработки кода клика и добавьте или удалите «требуется»'mark:

$(function () {

    $("#IsMasterProject").change(function () { OnIsMasterProjectValueChange(); });
    OnIsMasterProjectValueChange();
});

function OnIsMasterProjectValueChange() {
    if ($('#IsMasterProject').is(':checked')) {
        $('#IsMasterProjectLabel').append('<span class="label-required">*</span>');
    }
    else {
        $('#IsMasterProjectLabel span').remove()
    }
};

В контроллере вы можете подготовить действие show:

[Authorize]
public ActionResult Edit(int id)
{
    try
    {
        ProjectList project = prepare_ProjectList(id);

        return View(project);
    }
    catch (Exception ex)
    {
        sysHelper.LogError(ex, ModelState); ModelState.AddModelErrorException(ex, Request, "Probably selected data doesn't exist."); return View("Error");
    }
}

В действии сохранения вы можете проверить необходимые условия:

[HttpPost]
public ActionResult Edit(ProjectList project)
{
    try
    {
        if (ModelState.IsValid)
        {
            /* ------------------------------------------------------------------------ */
            /* HERE YOU CAN ADD YOUR CODE TO CHECK THE FIELD                            */
            /* ------------------------------------------------------------------------ */

            if (project.IsMasterProject && string.IsNullOrEmpty(project.MasterProjectNo))
            {
                ModelState.AddModelError("Model", "The MasterProjectNo field is required.");
            }

            /* ------------------------------------------------------------------------ */

            else
            {
                project.UserID = CurrentUser.ID;
                project.C_updated = DateTime.Now;

                db.ProjectList.Attach(project);
                db.Entry<ProjectList>(project).State = System.Data.Entity.EntityState.Modified;

                db.SaveChanges();

                return RedirectToAction("Index");
            }
        }
    }
    catch (Exception ex)
    {
        sysHelper.LogError(ex, ModelState);

        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
    }

    prepareViewBag(project);

    return View(project);
}

Это работает как шарм :) Удачи.

0 голосов
/ 12 декабря 2011

Звучит так, что это не столько модель, сколько вид.Даже если бы вы могли динамически связать требование такого рода с моделью, это пошло бы вразрез с целью MVC в отделении логики модели от логики представления.Я бы порекомендовал вам создать шаблон для элементов управления публикацией, который будет включен (вместе с поддержкой проверки), когда у вас есть модель, которая играет роль «Издателя».

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