MVC4发布表单空值

时间:2014-06-01 18:50:40

标签: asp.net-mvc forms asp.net-mvc-4

当客户端点击“编辑”时,我有一个网格,就像表单打开一样。用户只能编辑一些值(让用户只编辑当前订单的发货日期),但是当我发送表格时,不可编辑字段的值在发布时为NULL

当我显示:

@Html.Display(model => model.Rep)

或:

@Html.TextBoxFor(model => model.ClientName, new { disabled = "disabled", @readonly = "readonly" }) 

值正确显示但是当我提交表单时,Value为Null。 观点:

@model Models.Orders
@{
    Layout = null;
}
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link href="~/Content/pure-release-0.5.0/pure-min.css" rel="stylesheet" />
</head>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <body>
    <form class="pure-form">
        <fieldset>
             <legend>A Stacked Form</legend>
            <div class="pure-g">
                <div class="pure-u-1 pure-u-md-1-3" aria-disabled="true" aria-readonly="true">
                    <label for="first-name">@Html.LabelFor(model => model.Rep)</label>
                    @Html.Display(model => model.Rep)
                </div>
                <div class="pure-g">
                    <div class="pure-u-1 pure-u-md-1-3" aria-readonly="true">
                        <label for="first-name">@Html.LabelFor(model => model.ClientName)</label>
                        @Html.TextBoxFor(model => model.ClientName, new { disabled = "disabled", @readonly = "readonly" }) 
                    </div>
                </div>
            </div>
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    </form>
    </body>
}
</html>
<script type="text/javascript">
    $(document).ready(function () {
        $(".Titre").click(function () {
            $(this).next('.Contenu').slideToggle("slow");
        });
        $("#Model").prop('disabled', true);
    });
</script>


@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}^

模特:

 public class Orders
{
        public int ID { get; set; }
        public string Rep { get; set; }
        public string ClientName { get; set; }
}

控制器:

当用户点击网格上的编辑时:

 public ActionResult Edit(int id = 0)
        {
            Orders order = db.Orders.Find(id);
            if (order == null)
            {
                return HttpNotFound();
            }
            return View(order);
        }

在帖子上:

[HttpPost]
public ActionResult Edit(Orders order)
    {
        if (ModelState.IsValid)
        {
            db.Entry(order).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(order);
    }

当我调试时,我发现命令中的值为NULL

我认为问题是我从网格向表单发送数据的问题,但我将easyui更改为Use GridMVC并仍然存在问题。

我使用:在View TextBoxFor中将readOnly +禁用为attribut但同样的问题

我试过了: 在模型中:[ReadOnly(true)] +在视图中:@Html.EditorFor(model => model.Rep)但我能够编辑我要阻止的Rep

我尝试使用Javascript编辑EditorFor,但我能够编辑

你能帮助我吗,我尝试了所有我发现但我的代码中缺少的东西

由于

4 个答案:

答案 0 :(得分:0)

这是设计的。只读值不会提交给服务器(至少现代浏览器)。

如果您想提交此值,则可以创建隐藏字段而不是文本框:

@Html.HiddenFor(model => model.ClientName)

这将有效地将您的价值提交给服务器

答案 1 :(得分:0)

问题是因为您使用了两种形式:一种嵌套到另一种形式。您必须删除第二个并将css类添加到第一个。 Html.BeginForm()将创建另一种形式。 你可以尝试这样的事情:

 @using (Html.BeginForm("Edit","controllerName",null,FormMethod.Post,{@class="pure-form"}))
{
 @Html.ValidationSummary(true)
 <body>
   @Html.HiddenFor(model => model.ID)    
    <fieldset>
         <legend>A Stacked Form</legend>
        <div class="pure-g">
            <div class="pure-u-1 pure-u-md-1-3" aria-disabled="true" aria-readonly="true">
                <label for="first-name">@Html.LabelFor(model => model.Rep)</label>
                @Html.Display(model => model.Rep)
            </div>
            <div class="pure-g">
                <div class="pure-u-1 pure-u-md-1-3" aria-readonly="true">
                    <label for="first-name">@Html.LabelFor(model => model.ClientName)</label>
                    @Html.TextBoxFor(model => model.ClientName, new { disabled = "disabled", @readonly = "readonly" }) 
                </div>
            </div>
        </div>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
</body>
}

答案 2 :(得分:0)

您的文字框已停用。带有disabled属性集的输入不会随表单一起提交。您可以使用Chrome开发工具的网络标签或您喜欢的浏览器来验证这一点。如果要禁用文本框,请仅使用readonly而不是禁用。因此,您的文本框应如下所示:

 @Html.TextBoxFor(model => model.ClientName, new {@readonly = "readonly" }) 

之后,您可以使用jQuery和CSS,如果您愿意,可以通过将它们变灰来使它们看起来像禁用,但如果您希望值通过则不要使用禁用。

答案 3 :(得分:0)

我遇到了同样的问题。尝试使用MVC CRUD模板进行快捷方式。我喜欢@PaulTaylor的建议:

Attribute [Bind(Exclude=“”)] fails to prevent over-posting