如何将隐藏字段值从视图传递到控制器ASP.NET MVC 5

时间:2016-09-09 06:55:42

标签: c# asp.net-mvc entity-framework

我试图通过执行以下操作将隐藏字段值从视图传递到控制器

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

并尝试了

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

在这两个实例上,ArticleId的值为0,但是当我使用TextboxFor时,我可以看到正确的ArticleId,请帮助

这是

查看

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

控制器

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

模型

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; }
}

视图模型

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

4 个答案:

答案 0 :(得分:5)

视图中的模型为new complexFilter { key = "created_in", value = new associativeEntity { key = "in", value = "websiteA,websiteB,websiteC" } }; ,因此POST方法中的参数必须匹配。你使用

ArticlesCommentsViewModel

是正确的,但您需要将方法更改为

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

并且模型将被正确绑定。

作为旁注,您的[HttpPost] public ActionResult Create(ArticlesCommentsViewModel model) 不应包含数据模型,而应仅包含视图中所需的属性。如果typeof ArticlesCommentsViewModel包含具有验证属性的属性,则Articles将无效,因为您未发布ModelState的所有属性。

但是,由于Article已包含CommentsViewModel的属性,因此您可以使用

ArticleId

和POST方法

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

有效地剥离“评论”前缀

答案 1 :(得分:1)

在控制器中,您需要使用模型传递隐藏值, 例如,如果您将userId作为隐藏值,则在您的页面中添加:
@Html.HiddenFor(x => x.UserId)

在您的模型中,您当然也有UserId。
在控制器中,您需要将模型作为参数 public async Task<ActionResult> ControllerMethod(YourViewmodel model) { model.UserId //this should be your HiddenValue

答案 2 :(得分:1)

我猜你的模型在Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session 内有另一个名为Articles的类。更改控制器功能以相应地访问ArticleId。

CommentsViewModel

答案 3 :(得分:0)

在我的情况下,我没有将hidden输入放在表单部分中,但是没有格式,所以它不会发送到后端。确保将hidden输入放在表单内。