模型不受HTTP回发的约束

时间:2014-10-06 17:12:59

标签: asp.net razor asp.net-mvc-5

我正在尝试创建文章列表。允许用户一次编辑一个并将其发回数据库。我可以显示什么是好的但是当表单发布时模型没有绑定到http postback。我的代码如下。

我有以下POCO输入类:

public class ArticleInputModel
{
    public int articleID { get; set; }

    [AllowHtml]
    [DataType(DataType.MultilineText)]
    public string title { get; set; }

    [AllowHtml]
    [DataType(DataType.MultilineText)]
    public string content { get; set; }
}

以下控制器:

[ValidateInput(false)]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Set(ArticleInputModel articleInputModel)
    {
        // Do Work
    }

以下观点:

@model List<TRN.DAL.Article>

<div class="container">
    @for (var articleIndex = 0; articleIndex < Model.Count; articleIndex++)
    {
        using (Html.BeginForm("Set", "Articles", FormMethod.Post))
        {
            <h1 id="title" class="editable mce-content-body" contenteditable="true" spellcheck="false" style="position: relative;">@Model[articleIndex].title</h1>
            <div id="content" class="editable mce-content-body" style="width: 100%; position: relative;" contenteditable="true" spellcheck="false">
                @Model[articleIndex].content
            </div>
            <div>
                <button type="submit" class="btn btn-trn">Submit</button>
            </div>
        }
    }
</div>

1 个答案:

答案 0 :(得分:1)

您没有呈现任何输入,因此没有值回发。您需要为要回发的属性包含隐藏的输入,并使用javascript将隐藏输入的内容更新为可编辑元素的内容(或使用AJAX发布值)。

例如(请注意,您在循环中生成了重复的ID,因此我使用了类名)

using (Html.BeginForm("Set", "Articles", FormMethod.Post))
{
  @Html.Hidden("title", Model[articleIndex].title, new { id = "title" + articleIndex })
  @Html.Hidden("content", Model[articleIndex].content, new { id = "content" + articleIndex })
  <h1 class="title editable mce-content-body" contenteditable="true" spellcheck="false" style="position: relative;">@Model[articleIndex].title</h1>
  <div class="content editable mce-content-body" style="width: 100%; position: relative;" contenteditable="true" spellcheck="false">@Model[articleIndex].content</div>
  <div>
    <button type="submit" class="btn btn-trn">Submit</button>
  </div>
}

脚本

$('form').submit(function() {
  // Get values of contenteditable elements
  var title = $(this).children('.title').text();
  var content = $(this).children('.content').text();
  // Update hidden inputs
  var inputs = $(this).children('input[type="hidden"]');
  inputs.eq(0).val(title);
  inputs.eq(1).val(content);
});