【问题标题】:MVC4 Post form null valueMVC4 发布表单空值
【发布时间】:2014-06-01 18:50:40
【问题描述】:

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

当我显示时:

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

或:

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

值显示正确,但是当我提交表单时,值是空的。 视图:

@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 更改为使用 GridMVC 并且仍然存在问题。

我使用:在 View TextBoxFor for readOnly + disabled as attribut 但同样的问题

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

我尝试使用 Javascript 将 EditorFor 设为只读,但我能够编辑

您能帮帮我吗,我尝试了所有找到的方法,但我的代码中缺少一些东西

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    如果你想提交这个值,你可以创建一个隐藏字段而不是文本框:

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

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

    【讨论】:

    • 谢谢@Html.HiddenFor(model =&gt; model.ClientName) 将隐藏我想向用户显示这些字段的字段,只显示它而不让他编辑这些值
    • 如果您想显示只读值并将其提交给服务器,您可以提交该值的隐藏字段,并使用您想要的任何 HTML 输出值,例如
      @Model.ClientName
      。这样你就可以得到提交的值和你想要的任何 html
    • 谢谢dotnetom,我不想提交ClientName,只是为了更新一些值,示例让用户只编辑当前订单的发货日期
    • 在这种情况下,我建议使用您想要的任何 html 并使用 @Model.ClientName 输出值
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      问题是因为您使用了两种形式:一种嵌套到另一种。您必须删除第二个并将 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>
      }
      

      【讨论】:

      • 谢谢,但它不起作用,该字段被禁用但值为空
      • 我已将ID 字段更新为隐藏。值为空或模型无效?因为如果您不传递所有字段,Binder 将无法正确构建订单。如您所说,放置一个断点以查看您的值是否为空。只需添加 ID
      • 是的,ID 字段按照您的建议隐藏,我在控制器中的编辑中断,模型有效if (ModelState.IsValid) return true
      • @ProtoCus 如果是真的,你还传空值吗?
      • [HttpPost] public ActionResult Edit(Orders order) Order--> ClientName = null
      【解决方案4】:

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

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

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

      【讨论】:

      • 谢谢我尝试了你的建议,但是在发送表单时我的 clientName 为 null 这是发送之前页面的查看源 &lt;form action="/Orders/Edit/202" method="post"&gt;&lt;input data-val="true" data-val-number="The field ID must be a number." data-val-required="The ID field is required." id="ID" name="ID" type="hidden" value="202" /&gt;&lt;fieldset&gt; &lt;div class="pure-g"&gt; &lt;div aria-disabled="true" aria-readonly="true"&gt; &lt;div class="ClientName"&gt;&lt;label for="ClientName"&gt;Sales&lt;/label&gt; The Client Name&lt;/div&gt;
      • 即使我把(@Html.TextBoxFor(model =&gt; model.ClientName)没有new { @readonly = "readonly"}发送的值为空
      • 它可能在 html 源代码中,但如果它被禁用则不会被提交。你看过 chrome 的网络选项卡吗? developer.chrome.com/devtools/index$("#Model").prop('disabled', true); 在做什么?页面上有名为 Model 的东西吗?尝试删除/评论该行。
      • 显然disabledreadonly 属性都在做同样的事情。两者都将字段变灰,两种情况下的值都是null
      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2018-08-20
      • 1970-01-01
      • 2023-03-31
      • 2016-03-01
      • 1970-01-01
      相关资源
      最近更新 更多