表单不提交文本框的新值

时间:2013-07-23 07:51:26

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

我有一个表单,其文本框是通过循环生成的,并包含其默认值。但是在提交时,我得到了它的默认值,而不是刚更新的值。

以下是cshtml代码

<fieldset>
    <legend>Module <small>Edit</small></legend>
     @using (Html.BeginForm("Edit", "Module"))
    {
        @Html.ValidationSummary(true)
        @Html.HiddenFor(m=>m.Id)
        for(var i = 0; i < Model.Properties.Count(); i++)
        {
             @Html.HiddenFor(model=>Model.HiddenProperties[i].Value)
            <label class="label">@Model.Properties[i].Name</label>
            <div class="input-block-level">@Html.TextBoxFor(model => Model.Properties[i].Value, new { @value = Model.Properties[i].Value })</div>
        }

         <div class="form-actions">
        <button type="submit" class="btn btn-primary" id="Submit">Save changes</button>
        @Html.ActionLink("Cancel", "ModuleList", null, new { @class = "btn " })
    </div>

    }
</fieldset>

知道我在做什么错误吗? 我正在使用hiddenfor,以便我可以检查用户是否更改了之前的值。

EDIT1: 我试过了

new { Value = Model.Properties[i].Value } 

new { @Value = Model.Properties[i].Value }

仍然无效。

EDIT2: 刚刚意识到它默认显示当前值,所以我删除了textboxfor中的新部分。仍然没有在控制器的post方法中获得更新值。所以现在我有了

<div class="input-block-level">@Html.TextBoxFor(model => Model.Properties[i].Value)</div>

编辑3:这里是让事情更清晰的图片

enter image description here

现在在下面的图片中我尝试将MicrophoneArrayRackModuleId的值 999888 的值更改为 99988877 ,只需在当前值的末尾键入77然后点击save changes按钮

enter image description here

点击save changes按钮后,我转发到HttpPost方法,在检查方法中的module参数后,我会看到图片中显示的值。我原以为 99988877 ,但显示 999888

enter image description here

Edit4: 在从chrome运行开发人员工具时,我检查了network-&gt; httppost method-&gt; Headers-&gt; formdata,这就是它显示的内容

Id:50
HiddenProperties[0].Value:999888
Properties[0].Value:99988877
HiddenProperties[1].Value:000-00000-000
Properties[1].Value:000-00000-000
HiddenProperties[2].Value:1a2b3c
Properties[2].Value:1a2b3c

这是我在控制器的post方法中所期望的值但是没有发生。

Edit5: 正如Darin所提到的,我在视图中添加了名称字段,现在看起来像

        for(var i = 0; i < Model.Properties.Count(); i++)
        {
            @Html.HiddenFor(model=>model.HiddenProperties[i].Name)
             @Html.HiddenFor(model=>model.HiddenProperties[i].Value)
            <label class="label">@Model.Properties[i].Name</label>
            <div class="input-block-level">@Html.TextBoxFor(model => model.Properties[i].Value)</div>
        }

仍然不起作用

Edit6:模型

  public class PropertyViewModel
    {
        public string Name { get; set; }
        public string Value { get; set; }
    }

public class EditModule
{
    public long Id { get; set; }
    public List<PropertyViewModel> Properties { get; set; }
    public List<PropertyViewModel> HiddenProperties
    {
        get { return Properties; }
        set { Properties = value; }
    } 
}

控制器

[HttpGet]
public ActionResult Edit(long id)
{
    var module = _repository.GetModuleProperties(id);
    return View(module);
}

    [HttpPost]
    public ActionResult Edit(EditModule module)
    {
        if (ModelState.IsValid)
        { 
             _repository.SaveModuleEdits(module); 
            Information("Module was successfully edited!");
            return RedirectToAction("ModuleList", "Module", new {area = "Hardware"});
        }
        Error("Edit was unsuccessful, if the problem persists please contact Merijn!");
        return RedirectToAction("ModuleList", "Module", new { area = "Hardware" });

    }

存储库

public EditModule GetModuleProperties(long id)
{
    var properties = new EditModule
        {
            Id = id,
            Properties =_dbSis.Modules.Where(t => t.Id == id)
                                      .SelectMany(m => m.PropertyConfiguration.PropertyInstances.Select(i => new PropertyViewModel
                                       {
                                           Name = i.Property.Name,
                                           Value = i.Value
                                       })).ToList()

        };
    return properties;
}

3 个答案:

答案 0 :(得分:0)

写:

@Value

取代:

@value

答案 1 :(得分:0)

就这样离开:

@Html.TextBoxFor(model => model.Properties[i].Value)

答案 2 :(得分:0)

您从未发送过Name属性,这就是为什么它始终为NULL。确保将其包含在隐藏字段中:

@Html.HiddenFor(model => model.HiddenProperties[i].Name)

也不要在闭包中捕获Model。在编写表达式时使用model变量:

@Html.HiddenFor(model => model.HiddenProperties[i].Value)

此外,您绝对不需要设置Value属性,这就是Html助手的用途:

@Html.TextBoxFor(model => model.Properties[i].Value)