モデルクラスに次のデータ注釈を定義しました:-
[Display(Name = "Lab Test Description")]
[Required]
public int LabTestID { get; set; }
[Display(Name = "Test Result")]
[Range(typeof(decimal), "0.00", "9999999999.9999999999")]
[Required]
public decimal Result { get; set; }
次に、ビューで、テーブル内に10個の作成フォームを表示するために、次を定義しました:-
@model Medical.Models.VisitLabResult
<table>
<tr>
<th>
Lab Test
</th>
<th>
Result
</th>
<th>
Date Taken
</th>
<th>
Comment
</th>
<th>
</th>
</tr>
@for (int item = 0; item < 10; item++)
{
using (Ajax.BeginForm("CreateAll", "VisitLabResult", new AjaxOptions
{
HttpMethod = "Post",
UpdateTargetId = item.ToString(),
InsertionMode = InsertionMode.Replace }))
{
<tr id = "@item">
@Html.ValidationSummary(true)
@Html.AntiForgeryToken()
<td>
@Html.DropDownList("LabTestID", String.Empty)
@Html.ValidationMessageFor(model => model.LabTestID)
</td>
<td>
@Html.EditorFor(model => model.Result)
@Html.ValidationMessageFor(model => model.Result)
</td>
<td>
@Html.TextBox("DateTaken", null, new { @id = "DateTaken" + item.ToString(), DataFormatString = "{0:D}" , ApplyFormatInEditMode = true })
@Html.ValidationMessageFor(model => model.DateTaken)
</td>
<td>
@Html.EditorFor(model => model.Comment)
@Html.ValidationMessageFor(model => model.Comment)
</td>
<td>
@Html.HiddenFor(model => model.VisitID)
<input type="submit" value="Create" />
</td>
</tr>
}
}
</table>
<div>
@Html.ActionLink("Back To Current Visit", "Edit", "Visit", new { id = Model.VisitID }, null)
</div>
上記の 10Beginforms
は、次のアクション メソッドを個別に呼び出します。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateAll(VisitLabResult vlr)
{
try
{
if (ModelState.IsValid)
{
repository.AddVisitLabResult(vlr);
repository.Save();
string message = repository.checkrange(vlr.LabTestID,vlr.VisitID);
var lab = repository.GetLabTest(vlr.LabTestID,false);
ViewBag.status = message;
return PartialView("_create",vlr) ;} }
catch (DbUpdateException)
{ ViewBag.LabTestID = new SelectList(repository.FindAllLabTest(), "LabTestID", "Description", vlr.LabTestID);
ModelState.AddModelError("LabTestID", "The Same test Type might have been already created,, go back to the Visit page to see the avilalbe Lab Tests");
ViewBag.status = "Error";
return PartialView("_createToedit", vlr);
}
ViewBag.LabTestID = new SelectList(repository.FindAllLabTest(), "LabTestID", "Description", vlr.LabTestID);
ViewBag.status = "Error";
return PartialView("_createToedit", vlr);
}
上記のコードに示すように、アクションが正常に実行された場合、アクション メソッドは「_create」部分ビューを返します。エラーが発生した場合は、「_createToedit」部分ビューを返しますが、次のようになります。
<td>
@Html.ValidationSummary(true)
@Html.AntiForgeryToken()
@Html.DropDownList("LabTestID", String.Empty)
@Html.ValidationMessageFor(model => model.LabTestID)
</td>
<td>
@Html.EditorFor(model => model.Result)
@Html.ValidationMessageFor(model => model.Result)
</td>
<td>
@Html.EditorFor(model => model.DateTaken)
@Html.ValidationMessageFor(model => model.DateTaken)
</td>
<td>
@Html.EditorFor(model => model.Comment)
@Html.ValidationMessageFor(model => model.Comment)
</td>
<td>
@Html.HiddenFor(model => model.VisitID)
<input type="submit" value="Create" />
</td>
しかし、現在、上記のコードで次の2つの問題に直面しています:-
1. fireFox または chrome ブラウザーを使用してシステムにアクセスすると、ユーザーは ModelState エラーとデータ注釈エラーを含む「_createToedit」部分ビューを再送信できません。ユーザーが「作成」ボタンをクリックしても、何も起こりません (ビューには同じエラーと同じフィールドが表示され続けます!!!)。ユーザーは問題なく Internet Explorer 9 を使用して部分ビューを再送信できます。
2. 2つ目の問題は、アプリケーション内でクライアント側の検証を有効にしているにもかかわらず、ユーザーが [作成] ボタンをクリックしない限り、[必須] などのすべてのデータ注釈検証が表示されないことです (クライアント側の検証は機能しています)。他のビューでも) . この問題は、すべてのブラウザー (IE9、firefox、および chrome) で発生しています。
上記の2つの問題を引き起こしている私のコードで何が間違っているかを見つけるのを手伝ってくれる人はいますか.*助けてくれてありがとう. ブラジル