web-dev-qa-db-fra.com

Comment ajouter un message d'erreur personnalisé avec “requis” htmlattribute à l'éditeur de saisie de texte mvc 5 razor view

Je suis naïf pour Asp.Net MVC.

J'ai une vue partielle (ASP.Net MVC) dans laquelle j'ai quelques champs obligatoires que je veux afficher un message d'erreur personnalisé si l'un des champs obligatoires n'est pas fourni. Ci-dessous, le code complet cshtml pour ma vue partielle.

@model CMSAdminPanel.ViewModel.ProductView
<h4>Material And Labour Cost For Each Size</h4>
<hr />
@Html.ValidationSummary(false, "", new { @class = "text-danger" })
@for (int i = 0; i < Model.ServiceView.ListPriceView.Count; i++)
{
    @Html.HiddenFor(x => x.ServiceView.ListPriceView[i].ProductSizeType)
    <div class="form-group">
        @Html.LabelFor(x => x.ServiceView.ListPriceView[i].ProductSizeTypeName, "Size - " + Model.ServiceView.ListPriceView[i].ProductSizeTypeName, htmlAttributes: new { @class = "control-label col-md-4" })
    </div>

    <div class="form-group">
        @Html.LabelFor(x => x.ServiceView.ListPriceView[i].LabourCost, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(x => x.ServiceView.ListPriceView[i].LabourCost, new { htmlAttributes = new { @class = "form-control", required = "required"} })
            @Html.ValidationMessageFor(x => x.ServiceView.ListPriceView[i].LabourCost,"", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(x => x.ServiceView.ListPriceView[i].MaterialCost, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(x => x.ServiceView.ListPriceView[i].MaterialCost, new { htmlAttributes = new { @class = "form-control", required = "required" } })
            @Html.ValidationMessageFor(x => x.ServiceView.ListPriceView[i].MaterialCost, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(x => x.ServiceView.ListPriceView[i].Profit, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(x => x.ServiceView.ListPriceView[i].Profit, new { htmlAttributes = new { @class = "form-control", required = "required" } })
            @Html.ValidationMessageFor(x => x.ServiceView.ListPriceView[i].Profit, "", new { @class = "text-danger"})
        </div>
    </div>
}

Je souhaite afficher le message personnalisé "Le coût en matériel est requis" pendant que je reçois le message "Ce champ est obligatoire". Donc, je veux remplacer ce message d'erreur difault côté client.

Je veux réaliser quelque chose comme ça:

<div class="form-group">
        @Html.LabelFor(x => x.ServiceView.ListPriceView[i].LabourCost, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(x => x.ServiceView.ListPriceView[i].LabourCost, new { htmlAttributes = new { @class = "form-control", required = "required", **data_val_required = "LabourCost is requried"**} })
            @Html.ValidationMessageFor(x => x.ServiceView.ListPriceView[i].LabourCost,"", new { @class = "text-danger" })
        </div>
    </div>

Toute suggestion/solution serait d'une grande aide

5
Aashish Kumar

Je trouve un moyen de remplacer ce message requis par défaut côté client en utilisant htmlAttribute title property. 

<div class="form-group">
        @Html.LabelFor(x => x.ServiceView.ListPriceView[i].LabourCost, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(x => x.ServiceView.ListPriceView[i].LabourCost, new { htmlAttributes = new { @class = "form-control", required = "required", title = "LabourCost is requried"} })
            @Html.ValidationMessageFor(x => x.ServiceView.ListPriceView[i].LabourCost,"", new { @class = "text-danger" })
        </div>
    </div>
7
Aashish Kumar

Dans votre classe de modèle, ajoutez l’attribut [Required] à modifier. 

[Required(ErrorMessage = "Material cost is required")]
public decimal MaterialCost {get;set;}

Une autre approche consiste à le définir à partir de JavaScript à l'aide de JQuery ou à remplacer l'attribut qui le définit. Par défaut, la sortie de la variable ValidationMessageFor est 

data-val-required="The field is required.".

SO, vous pouvez remplacer cette valeur dans votre balise

20
Haitham Shaddad

dans ton modèle 

[Required(ErrorMessage = "Material cost is required")]
public doubleMaterialCost { get; set; }

et vous pouvez choisir de le charger depuis Ressources et de transmettre une chaîne de ressources si votre site contient plusieurs cultures.

ou dans votre action 

public ActionResult(YourModel model)
{
    if (model.doubleMaterialCost == 0)
            ModelState.AddModelError("doubleMaterialCost ", "Material cost is required");
1
Ahmed Ragheb