Я объясню идею в коротком примере.У нас есть флажок «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);
}
Это работает как шарм :) Удачи.