web-dev-qa-db-fra.com

Comment puis-je transmettre la valeur du champ caché de la vue au contrôleur ASP.NET MVC 5

J'essaie de passer la valeur du champ caché de la vue au contrôleur en procédant comme suit

@Html.HiddenFor(model => model.Articles.ArticleId) 

et aussi essayé 

<input type="hidden" id="ArticleId" name="ArticleId" value="@Model.Articles.ArticleId" />

Dans les deux cas, la valeur de ArticleId est 0, mais lorsque j'utilise TextboxFor, je peux voir le bon ArticleId, veuillez aider.

C'est ici 

Vue 

@model ArticlesCommentsViewModel
....
@using (Html.BeginForm("Create", "Comments", FormMethod.Post))
{
<div class="row">
    <div class="col-xs-10 col-md-10 col-sm-10">
        <div class="form-group">
            @Html.LabelFor(model => model.Comments.Comment, new { @class = "control-label" })
            @Html.TextAreaFor(m => m.Comments.Comment, new { @class = "ckeditor" })
            @Html.ValidationMessageFor(m => m.Comments.Comment, null, new { @class = "text-danger"})
        </div>
    </div>
</div>

<div class="row">

        @*@Html.HiddenFor(model => model.Articles.ArticleId)*@
    <input type="hidden" id="ArticleId" name="ArticleId" value="@Model.Articles.ArticleId" />
</div>

<div class="row">
    <div class="col-xs-4 col-md-4 col-sm-4">
        <div class="form-group">
            <input type="submit" value="Post Comment" class="btn btn-primary" />
        </div>
    </div>
</div>
}

Manette

    // POST: Comments/Create
    [HttpPost]
    public ActionResult Create(CommentsViewModel comments)//, int ArticleId)
    {
        var comment = new Comments
        {
            Comment = Server.HtmlEncode(comments.Comment),
            ArticleId = comments.ArticleId,
            CommentByUserId = User.Identity.GetUserId()
        };
    }

Modèle

public class CommentsViewModel
{
    [Required(ErrorMessage = "Comment is required")]
    [DataType(DataType.MultilineText)]
    [Display(Name = "Comment")]
    [AllowHtml]
    public string Comment { get; set; }

    public int ArticleId { get; set; }
}

ViewModel

public class ArticlesCommentsViewModel
{
    public Articles Articles { get; set; }
    public CommentsViewModel Comments { get; set; }
}
4
user3543878

Le modèle dans la vue est ArticlesCommentsViewModel et le paramètre de votre méthode POST doit donc correspondre. Votre utilisation de

@Html.HiddenFor(model => model.Articles.ArticleId)

est correct, mais vous devez changer la méthode pour

[HttpPost]
public ActionResult Create(ArticlesCommentsViewModel model)

et le modèle sera correctement lié.

Remarque: votre ArticlesCommentsViewModel ne doit pas contenir de modèles de données, mais uniquement les propriétés dont vous avez besoin dans la vue. Si typeof Articles contient des propriétés avec des attributs de validation, ModelState serait invalide parce que vous ne publiez pas toutes les propriétés de Article.

Cependant, étant donné que CommentsViewModel contient déjà une propriété pour ArticleId, vous pouvez simplement utiliser

@Html.HiddenFor(model => model.Comments.ArticleId)

et dans la méthode POST

[HttpPost]
public ActionResult Create([Bind(Prefix="Comments")]CommentsViewModel model)

pour effacer efficacement le préfixe "Commentaires"

4
user3559349

Je suppose que votre modèle comporte une autre classe appelée Articles dans CommentsViewModel. Modifiez la fonction de votre contrôleur pour accéder à l'ArticleId en conséquence. 

[HttpPost]
public ActionResult Create(CommentsViewModel comments)//, int ArticleId)
{
    var comment = new Comments
    {
        Comment = Server.HtmlEncode(comments.Comment),
        ArticleId = comments.Articles.ArticleId,  // Since you are using model.Articles.ArticleId in view
        CommentByUserId = User.Identity.GetUserId()
    };
}
1
Jibin Balachandran

Dans mon cas, je passais quelques champs entre contrôleurs et vues. Je me suis donc servi des champs cachés dans les vues… .. Voici une partie de la vue. Notez qu'un contrôleur avait défini "selectedTraining" et "selectedTrainingType" dans le ViewBag pour passer à la vue. Je souhaite donc que ces valeurs soient transmises à un contrôleur. Sur la balise masquée, l'élément critique est défini sur l'attribut "name". "id" ne le fera pas pour vous.

@using (Html.BeginForm("Index", "ComplianceDashboard"))
{

<input type="hidden" value="@ViewBag.selectedTraining" id="selectedTraining" name="selectedTraining" />
<input type="hidden" value="@ViewBag.selectedTrainingType" id="selectedTrainingType" name="selectedTrainingType" />

if (System.Web.HttpContext.Current.Session["Dashboard"] != null)
{
    // Show Export to Excel button only if there are search results
    <input type="submit" id="toexcel" name="btnExcel" value="Export To Excel" class="fright" />
}

<div id="mainDiv" class="table">
    @Html.Grid(Model).Columns(columns =>

Puis revenez sur le contrôleur:

        // POST: Dashboard (Index)
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index(string Excel)
        {
            string selectedTraining, selectedTrainingType;

            selectedTraining = Request["selectedTraining"];
            selectedTrainingType = Request["selectedTrainingType"];

Vous pouvez également placer les demandes en tant que paramètres de la méthode: public ActionResult Index (chaîne Excel, chaîne selectedTraining, chaîne selectedTrainingType)

0
Steve