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