MVC 4 - message D'erreur de retour du contrôleur-Afficher en vue

je fais un projet C# à l'aide de Rasoir dans VS2010.(MVC 4). Je dois retourner le message d'erreur du contrôleur pour le visualiser et le montrer à L'utilisateur. Ce que j'ai été tenté:

CONTROLLER:

 [HttpPost]
 public ActionResult form_edit(FormModels model)
 {          
    model.error_msg = model.update_content(model);           
    ModelState.AddModelError("error", "adfdghdghgdhgdhdgda");
    ViewBag.error = TempData["error"];
    return RedirectToAction("Form_edit", "Form");

 }

VIEW:

@model mvc_cs.Models.FormModels
@using ctrlr = mvc_cs.Controllers.FormController


@using (Html.BeginForm("form_edit", "Form", FormMethod.Post))
{

        <table>
        <tr>
        <td>       
        @Html.ValidationSummary("error")       
        @Html.ValidationMessage("error")      
        </td>
        </tr>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.content_name)
            @Html.DropDownListFor(x => x.selectedvalue, new SelectList(Model.Countries, Model.dd_value, Model.dd_text), "-- Select Product--")

        </th>
    </tr>
</table>

<table>
    <tr>
        <td>
            <input  type="submit" value="Submit" />
        </td>
    </tr>
</table>
}

Merci de m'aider à atteindre cet objectif.

22
demandé sur Dominic Zukiewicz 2013-11-22 13:18:01

3 réponses

la vue retour (model) vous renvoie une erreur parce que vous ne remplissez pas le model avec les valeurs de votre méthode post et les données du model pour la liste déroulante sont vides. Veuillez fournir la méthode Get pour expliquer plus en détails comment gérer l'affichage de l'erreur. Pour l'erreur soit affiché, vous devez utiliser ceci:

[HttpPost]
public ActionResult form_edit(FormModels model)
{          
   if(ModelState.IsValid())
   {
      --- operations 
      return Redirect("OtherAction", "SomeController");
   }

   // here you can use a little trick
   //fill the model property that holds the information for the dropdown with the data 

   // you haven't provided the get method but it should look something like this
   model.Countries = ... some data goes here;
   model.dd_value = ... some other data;
   model.dd_text = ... other data;

   ModelState.AddModelError("", "adfdghdghgdhgdhdgda");
   return View(model);
}

puis, dans la vue juste de l'utilisation :

@model mvc_cs.Models.FormModels
@using ctrlr = mvc_cs.Controllers.FormController


@using (Html.BeginForm("form_edit", "Form", FormMethod.Post))
{

    <table>
    <tr>
    <td>       
    @Html.ValidationSummary(true)             
    </td>
    </tr>
<tr>
    <th>
        @Html.DisplayNameFor(model => model.content_name)
        @Html.DropDownListFor(x => x.selectedvalue, new SelectList(Model.Countries, Model.dd_value, Model.dd_text), "-- Select Product--")

    </th>
</tr>
</table>

<table>
<tr>
    <td>
        <input  type="submit" value="Submit" />
    </td>
</tr>
</table>
}

Cela devrait fonctionner bien.

si vous utilisez simplement RedirectToAction il vous redirigera vers le get méthode --> vous n'aurez pas d'erreur, mais la vue juste de le recharger et pas d'erreur sera affiché.

le contraire est que vous pouvez passer l'erreur pas par ModelState.AddError, mais avec ViewData["error"] comme ceci:

[HttpPost]
public ActionResult form_edit(FormModels model)
{          
   TempData["error"] = "someErrorMessage";
   return RedirectToAction("form_Post", "Form");
}

[HttpGet]
public ActionResult form_edit()
{
    do stuff here ----
    ViewData["error"] = TempData["error"];
    return View();
}

@model mvc_cs.Models.FormModels
@using ctrlr = mvc_cs.Controllers.FormController


@using (Html.BeginForm("form_edit", "Form", FormMethod.Post))
{

    <table>
    <tr>
    <td>       
    <div>@ViewData["error"]</div>             
    </td>
    </tr>
<tr>
    <th>
        @Html.DisplayNameFor(model => model.content_name)
        @Html.DropDownListFor(x => x.selectedvalue, new SelectList(Model.Countries, Model.dd_value, Model.dd_text), "-- Select Product--")

    </th>
</tr>
</table>

<table>
<tr>
    <td>
        <input  type="submit" value="Submit" />
    </td>
</tr>
</table>
}
27
répondu dlght 2013-11-27 21:12:23

Merci pour toutes les réponses.

j'ai été en mesure de résoudre ce problème en procédant comme suit:

CONTROLLER:

[HttpPost]       
public ActionResult form_edit(FormModels model)
{
  model.error_msg = model.update_content(model);
  return RedirectToAction("Form_edit", "Form", model);
}

public ActionResult form_edit(FormModels model, string searchString,string id)
{
  string test = model.selectedvalue;
  var bal = new FormModels();
  bal.Countries = bal.get_contentdetails(searchString);
  bal.selectedvalue = id;
  bal.dd_text = "content_name";
  bal.dd_value = "content_id";

  test = model.error_msg;
  ViewBag.head = "Heading";

  if (model.error_msg != null)
  {
    ModelState.AddModelError("error_msg", test);
  }

  model.error_msg = "";
  return View(bal);
}   

VIEW:

@using (Html.BeginForm("form_edit", "Form", FormMethod.Post))
{
  <table>
    <tr>
      <td>
        @ViewBag.error
        @Html.ValidationMessage("error_msg")
      </td>
    </tr>
    <tr>
      <th>
        @Html.DisplayNameFor(model => model.content_name)
        @Html.DropDownListFor(x => x.selectedvalue, new SelectList(Model.Countries, Model.dd_value, Model.dd_text), "-- Select Product--")
      </th>
    </tr>
  </table>
}
7
répondu Rethic 2014-04-17 18:21:00

Si vous voulez faire une redirection, vous pouvez soit:

ViewBag.Error = "error message";

ou

TempData["Error"] = "error message";
3
répondu Matt Millican 2013-11-27 13:21:14