J'ai la vue suivante , qui crée 10 ajax.beginform , Mais le problème auquel je suis confronté est que si une erreur se produit lors de la création de l'objet, le ModelState.AddModelError ne sera pas affiché sur la vue bien que j'aie défini la @Html.ValidationSummary(true)
La vue se présente comme suit
@model Medical.Models.VisitLabResult
@for (int item = 0; item < 10; item++)
{
<tr id = @item>
@using (Ajax.BeginForm("CreateAll", "VisitLabResult", new AjaxOptions
{
HttpMethod = "Post",
UpdateTargetId = item.ToString() + "td",
InsertionMode = InsertionMode.Replace,
LoadingElementId = "progress2",
OnSuccess = string.Format(
"disableform({0})",
Json.Encode(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.EditorFor(model => model.DateTaken)
@Html.ValidationMessageFor(model => model.DateTaken)
</td>
<td>
@Html.EditorFor(model => model.Comment)
@Html.ValidationMessageFor(model => model.Comment)
</td>
<td>
<input type="submit" value="Create" />
</td>
<td id = @(item.ToString() + "td")>
</td>
}
</tr>
}
</table>
Et ma méthode d'action qui définit le ModelState.AddModelError ressemble à ceci: -
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateAll(VisitLabResult vlr, int visitid = 28)
{
try
{
if (ModelState.IsValid)
{
var v = repository.GetVisit(visitid);
if (!(v.EligableToStart(User.Identity.Name))){
return View("NotFound");
}
vlr.VisitID = visitid;
repository.AddVisitLabResult(vlr);
repository.Save();
return Content("Addedd Succsfully");
}
}
catch (DbUpdateException)
{
JsonRequestBehavior.AllowGet);
ModelState.AddModelError(string.Empty, "The Same test Type might have been already created,, go back to the Visit page to see the avilalbe Lab Tests");
}
}
Alors, comment puis-je montrer le ModelState.AddModelError sur ma vue.
Je vous exhorte à changer votre try{ } catch(){ }
Et vérifiez d'abord s'il existe une visite pour l'identifiant donné et si c'est le cas, retournez simplement le modèle avec l'erreur de modèle ajoutée
if (visitExists)
{
ModelState.AddModelError("CustomError", "The Same test Type might have been already created,, go back to the Visit page to see the avilalbe Lab Tests");
return View(vlr);
}
//Other code here
Changez votre AddModelError en
ModelState.AddModelError("CustomError", "The Same test Type might have been already created,, go back to the Visit page to see the avilalbe Lab Tests");
Et à votre avis, ajoutez simplement un
@Html.ValidationMessage("CustomError")
Ensuite, lorsque vous retournez votre modèle, l'erreur s'affiche à l'endroit où vous avez placé le @ Html.ValidationMessage ...
@Html.ValidationSummary(true)
affiche uniquement le message d'erreur concernant les propriétés du modèle, si vous souhaitez afficher également le message ajouté, ajouté avec
ModelState.AddModelError(
"CustomError",
"The Same test Type might have been already created, go back to the Visit page to see the avilalbe Lab Tests");
vous devez définir @Html.ValidationSummary(false)
Si vous devez afficher le message de validation près de vos champs de saisie, vous devez définir @Html.ValidationSummary(true)
et suivre les étapes suggérées par Syneryx
Vous pouvez utiliser le dictionnaire ViewData
dans View pour accéder aux données ModelState
.
Par exemple:
en action:
ModelState.AddModelError("CustomError", "Error 1");
ModelState.AddModelError("CustomError", "Error 2");
et pour obtenir le message "Erreur 1":
ViewData.ModelState["CustomError"].Errors[0].ErrorMessage