ASP.NET MVC - 使用Html.BeginForm传递模型数据和非模型隐藏字段值

时间:2016-05-08 11:41:27

标签: asp.net asp.net-mvc-5 html.beginform

我正在使用BeginForm传递模型数据(即last_coffe_time),它工作正常。但是我还想传递给存储在隐藏字段中的控制器ClientDateTime值,该字段不是模型的一部分。 我不知道怎么做,充其量我可以将ClientDateTime作为静态字符串传递但我无法弄清楚如何动态读取隐藏字段的值并将该值传递给控制器​​。

有人请帮忙。谢谢

查看

@model SleepNotes.Models.Diary

@using (Html.BeginForm("Edit", "Diary", new { ClientDateTime = "ClientDateTime" }, FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">

        @Html.Hidden("ClientDateTime", new { id = "ClientDateTime" })

        <div class="form-group">
            @Html.LabelFor(model => model.last_coffe_time, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.last_coffe_time, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.last_coffe_time, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}
    <!--Set ClientDateTime-->
<script>
    var a = new Date()
    var month = a.getMonth() + 1;
    document.getElementById('ClientDateTime').value = a.getDate() + "/" + month + "/" + a.getFullYear() + " " + a.getHours() + ":" + a.getMinutes() + ":" + a.getSeconds();
</script>

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "id,last_coffe_time")] Diary Diary, string ClientDateTime)
{
    if (ModelState.IsValid)
    {
        //ClientDateTime from view ...do something here

        db.Entry(Diary).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index", "Dashboard");
    }
    return View(Diary);
}

2 个答案:

答案 0 :(得分:0)

有一些解决方案,

  1. 我建议您在Model和View之间使用ModelView。那 modalview应该有ClientDateTime。
  2. 您可以使用 ajax post 并将2个参数(yourmodal,string)发送给控制器或您 可以将ClientDateTime作为查询字符串传递。有很多 关于它的例子。
  3. 希望有所帮助。

答案 1 :(得分:0)

new { ClientDateTime = "ClientDateTime" }方法中删除BeginForm(),因此不会将该值添加为路由参数(因此不会绑定到string ClientDateTime方法中的Edit()参数。

附注:由于您要提交DateTime值,因此您的参数应为DateTime ClientDateTime(不是string),您的脚本可以简化为

document.getElementById('ClientDateTime').value = new Date().toISOString();