問題を説明する間、しばらくお待ちください。
フォームをコントローラーにポストし、モデルを更新してビューに戻しています。これは、送信ボタンを使用すると正しく機能しますが、非送信ボタンを使用して JavaScript でポストバックしようとすると機能しません。
この問題を探してみましたが、どのように表現すればよいか分からないので、それに近い結果を得ることができます。
基本的
正しい - input type="submit" である AddDetail ボタンをクリックすると、コントローラーが呼び出され、モデルが更新されてビューに戻され、要素がページに正しく表示されます。
間違っています - 入力 type="button" である AddDetail1 ボタンをクリックすると、ボタンをクリックすると JavaScript が呼び出され、コントローラー メソッドが呼び出され、FormCollection とモデルがコントローラーに正しく渡されます。モデルが更新されてビューに戻されますが、ページに表示される要素はありません。
このコードを 100 回実行しましたが、ビューに設定されている要素に至るまで、すべてがまったく同じです。唯一の違いは、送信ボタンはコントロールをレンダリングしますが、その他のボタンは何もレンダリングしないことです。各ボタンを押した後に HTML ソースを表示したところ、送信ボタンにコントロールが表示されましたが、その他のボタンをクリックしてもコントロールがありません。
ページに @Model.cases.count を追加しました-最初は正しい0が表示されますが、ポストバック後に送信ボタンに1が表示され、他のボタンのコードをステップ実行すると1が表示されます、しかし、ページが最終的に終了し、すべてがレンダリングされると、コードをステップ実行していたときに 1 だったにもかかわらず、0 が表示されます。
非常にイライラする
どんなアイデアでも大歓迎です。
これが私の単純化されたビューです
@model CASA.ViewModels.CaseViewModel
<script type="text/javascript">
$(function () {
$("#AddDetail1").click(function () {
var form = $(':input');
//var action = form.attr("action");
var serializedForm = form.serialize();
var url = '@Url.Action("CreateCase")';
//$.post(url, serializedForm);
$.ajax({
url: url,
data: serializedForm,
type: 'POST',
success: function (response) {
alert(response);
// process the results from the controller action
// window.location.href = response.Url;
}
});
});
});
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
@if (Model.cases != null && Model.cases.Count > 0)
{
for (int i = 0; i < Model.cases.Count; i++)
{
<tr>
<td>
@Html.TextBoxFor(m => m.cases[i].CaseNumber, new { @class = "textbox" })
</td>
<td>
@Html.TextBoxFor(m => m.cases[i].FirstName, new { @class = "nameTextbox" })
</td>
<td>
@Html.TextBoxFor(m => m.cases[i].LastName, new { @class = "nameTextbox" })
</td>
<td>
@Html.EditorFor(m => m.cases[i].DOB)
</td>
<td>
@Html.RadioButtonListFor(m => m.cases[i].Sex, Model.radiobuttons.RadioButtonListItems)
</td>
</tr>
}
}
<input type="submit" value="+" id="AddDetail" class="button" />
<input type="button" value="+" id="AddDetail1" class="button" />
}
これが私のコントローラーです:
[HttpPost]
public ActionResult CreateCase(FormCollection collection, CaseViewModel model)
{
if (ModelState.IsValid)
{
model.cases.Add(new CASA_Cases
{
CaseNumber = collection["CaseNumber"],
FirstName = collection["FirstName"],
LastName = collection["LastName"],
DOB = Convert.ToDateTime(collection["DOB"]),
Sex = collection["Sex"]
});
UpdateModel(model);
if (submit.Count() > 0)
{
model.cases.ForEach(item =>
{
if (model.group.ID == null)
{
model.group.ID = Guid.NewGuid();
model.group.UserID = Utilities.Utilities.GetUserID;
}
item.CASA_CaseGroups_ID = model.group.ID;
});
}
}
return View(model);
}