タイトルにあるものの組み合わせを一緒に機能させることができません。さまざまな質問を読みましたが、私がやろうとしているすべてをカバーするものは見つかりませんでした。
モーダル ウィンドウに jqModal を使用しています。私は Ajax.BeginForm を使用しています。私のモデルはなど[Required]
で飾られています。[Display(...)]
このようなものはすべて、を使用してページに配置されています@Html.RenderAction(...)
OnBegin
私が ajax 呼び出しを使用しているかどうかに応じてOnComplete
、クライアント側の検証を取得しない (更新が行われない) か、モーダルがダイアログなしでページ全体が「モーダルアウト」された状態でスタックします。場所。しかし、実際に私が望むのは、クライアント側またはサーバー側の検証エラーが発生した場合にモーダルをそのままにしておくことです。
このサイトは、javascript が利用可能/有効化されていなくても機能する必要はありません。
頭:
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/jquery.cleditor.css")" rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/jqModal.css")" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.6.1.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.cleditor.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.timeago.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jqModal.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/functions.js")"></script>
モデル:
public class ReplacedTextModel {
public ReplacedTextModel() { }
public ReplacedTextModel(int id, string text, string replaced) {
Id = id;
Text = text;
Replaced = replaced;
}
public int Id { get; set; }
[Required, Display(Description = "The text of the question", Prompt = "Please enter the question text."), UIHint("MultilineString")]
public string Text { get; set; }
public string Replaced { get; set; }
}
エディター テンプレート (これにはいくつかの拡張メソッドが含まれていますが、問題とは関係がないため、無視してください):
@model string
<div class="form-element">
@Html.Label("", new Dictionary<string, object> { { "title", Html.Description("") } })
@if (Html.IsRequired()) {
<span class="form-required">*</span>
}
<div class="form-control">
@Html.TextArea("", Model, new Dictionary<string, object> { { "title", Html.Prompt("") } })
<div class="form-validation">
@Html.ValidationMessage("")
</div>
</div>
</div>
ビュー (ページにこれらの多くがあり、繰り返される可能性があるため、一意性のために Guid を使用しています):
@model ReplacedTextModel
@{
var id = Guid.NewGuid().ToString("N");
var windowId = "id_" + id + "_window";
var triggerId = "id_" + id + "_trigger";
var replaceId = "id_" + id + "_replace";
var functionId = "id_" + id + "_closeForm";
}
<div id="@replaceId">
@Html.Raw(Model.Replaced)
<span class="edit-mode"><a id="@triggerId" href="#">edit</a></span>
<div id="@windowId" class="jqmWindow" style="display: none">
@using (Ajax.BeginForm("Text", new AjaxOptions { UpdateTargetId = replaceId, OnBegin = functionId, HttpMethod = "POST" })) {
@Html.HiddenFor(x => x.Id)
@Html.EditorFor(x => x.Text)
<input type="submit" value="Save" />
}
<div><a href="#" class="jqmClose">Cancel</a></div>
</div>
<script type="text/javascript">
$(function () { $("#@windowId").jqm({ trigger: "#@triggerId" }); });
function @(functionId)() {
// THIS IS A PROBLEM
// if it's not called or is called on OnBegin then the modal doesn't close properly
// if OnComplete is used, the dialog disappears but the validation doesn't work
// in either case, validation failure on backend (try posting whitespace) doesn't show validation errors.
$("#@windowId").jqmHide();
};
</script>
</div>
コントローラーのメソッド:
public ActionResult Text(int id) {
return PartialView("Text", ReplacedTextModel.Get(id));
}
[HttpPost]
public ActionResult Text(int id, string text) {
if (ModelState.IsValid) {
try {
if (string.IsNullOrWhiteSpace(text)) throw new ArgumentException("No text was provided for the question.", "text");
ReplacedTextModel.Update(id, text);
} catch (Exception ex) {
ModelState.AddModelError(ex);
}
}
return Text(id);
}
長い投稿で申し訳ありませんが、他の人がそれは悪いことではないと言っているのを見ました! リクエストがあれば、追加のコード/情報を投稿していただければ幸いです。プロジェクトのいくつかの場所からコピー/貼り付けしたため、何かを見落としている可能性があります。
前もって感謝します。