Подтвердить что ты не робот

ModelState.AddModelError не отображается внутри моего представления

У меня есть следующее представление, которое создает 10 ajax.beginform. Но проблема, с которой я сталкиваюсь, заключается в том, что при возникновении ошибки возникает при создании объекта, тогда ModelState.AddModelError не будет отображаться на представлении, хотя я установил @Html.ValidationSummary(true) Вид выглядит следующим образом

@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>

И мой метод действий, который определяет ModelState.AddModelError, выглядит следующим образом: -

[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");
    }
}

Итак, как я могу показать ModelState.AddModelError на моем представлении.

4b9b3361

Ответ 1


Я бы настоятельно рекомендовал вам изменить ваш try{ } catch(){ }

И сначала проверьте, существует ли визит для данного идентификатора и если это так просто возвращает модель с добавленной ошибкой модели

    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

Измените свой AddModelError на

ModelState.AddModelError("CustomError", "The Same test Type might have been already created,, go back to the Visit page to see the avilalbe Lab Tests");

И на ваш взгляд просто добавьте

@Html.ValidationMessage("CustomError")

Затем, когда вы вернете свою модель, будет показана ошибка, где вы разместили @Html.ValidationMessage...

Ответ 2

@Html.ValidationSummary(true) показывает только сообщение об ошибке о свойствах модели, если вы хотите показать также добавленное сообщение, добавленное с помощью

ModelState.AddModelError(
    "CustomError", 
    "The Same test Type might have been already created, go back to the Visit page to see the avilalbe Lab Tests"); 

вам нужно установить @Html.ValidationSummary(false) Если вам нужно отобразить сообщение проверки рядом с вашими полями ввода, вам нужно установить @Html.ValidationSummary(true) и выполнить шаги, предложенные Syneryx

Ответ 3

Вы можете использовать словарь ViewData в представлении для доступа к данным ModelState.

Например:

в действии:

ModelState.AddModelError("CustomError", "Error 1");
ModelState.AddModelError("CustomError", "Error 2");

и получить сообщение "Ошибка 1":

ViewData.ModelState["CustomError"].Errors[0].ErrorMessage