编辑表单不起作用,数据传递给服务器但不传递给httpPost方法

时间:2013-07-24 14:07:01

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

昨天我问了一个问题,可以找到here和。{ 基于我从asp.net/mvc论坛得到的答案here,我被告知要清除我的模型状态,因为默认情况下我的表单倾向于保持其默认值,而不是我刚试过的值更新。所以,我添加了Modelstate.Clear(),但仍无效。任何人都可以告诉我,如果我在错误的地方使用ModelState.Clear()或者我是否需要更改某些内容?

所以,这就是问题所在,我有一个编辑表单,当用户单击编辑按钮时,它会在文本框中显示其当前值。如果用户想要编辑文本框中显示的某个当前值,他会在文本框中编辑值并单击“保存更改”按钮。目前正在发生的是我的HttpPost方法,当我检查传递的值时,我没有得到刚刚提供的新值用户,而是获得在窗体中显示为当前值的值。 但是当我在chrome中检查开发人员工具时,它会显示刚刚提供的新值用户作为传递给服务器的值。

这是我的观点

@using BootstrapSupport
@model AdminPortal.Areas.Hardware.Models.EditModule
@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/shared/_BootstrapLayout.basic.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].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>
        }

         <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>
<p>
    @Html.ActionLink("Back to List", "ModuleList")
</p>

这是控制器中的get和post方法

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

        [HttpPost]
        public ActionResult Edit(EditModule module)
        {
            ModelState.Clear();
            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" });

        }

1 个答案:

答案 0 :(得分:1)

问题出在您的模型上:

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

您要回复PropertiesHiddenProperties,但只更改Properties。模型绑定器在Properties中设置新值,然后设置HiddenProperties的值,然后设置Properties并且您刚刚覆盖了更改。

我不确定你究竟要用HiddenProperties做什么,但它已经完全打破,因为它目前已经设置好了。

更新:建议更改

<强>模型

public class EditModule
{
    public long Id { get; set; }
    public List<PropertyViewModel> Properties { get; set; }
}

删除了HiddenProperties属性

控制器操作

[HttpPost]
public ActionResult Edit(long id, EditModule module)
{
    var originalModule = _repository.GetModuleProperties(id);

    // do whatever comparisons you want here with originalModule.Properties / module.Properties 

    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" });
}

编辑POST版本采用id就像GET版本一样。您可以使用此id从数据库中查找模块的原始版本,然后您可以比较Properties的原始版本和已发布版本。

查看

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    @Html.HiddenFor(m=>m.Id)
    for(var i = 0; i < Model.Properties.Count(); i++)
    {
        <label class="label">@Model.Properties[i].Name</label>
        <div class="input-block-level">@Html.TextBoxFor(model => 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>
}

Html.BeginForm()语法告诉Razor只使用当前页面的URL作为表单的操作。 HiddenProperties表单字段已被删除。