ASP.NET MVC在编辑时保持mdoel的ID值

时间:2010-03-16 23:15:30

标签: asp.net-mvc

public Edit(int? id){ /* Codes */ }

[HttpPost]
public Edit(Item model){ /* Codes */ }

我在第一个Edit方法中检索Item的副本,该方法将包含ItemID的值。但是当它到达HttpPost方法时,id值就丢失了。

如果切换到

public Edit(int? ItemID){ /* Codes */ }

[HttpPost]
public Edit(Item model){ /* Codes */ }

这样ItemID可以保存在Item模型中。 但这是处理它的好方法吗? ASP.NET MVC是否总能知道它需要将“ItemID”插入Item? 还有其他方法来保持ID值吗?感谢。

6 个答案:

答案 0 :(得分:1)

我无法理解你如何在HttpPost处理中丢失id。也许你应该检查你的活页夹,并可能自己写一个?根据我的经验,默认粘合剂有点麻烦。你可以从 here 开始,虽然我不假装它是最好的解决方案。如果您需要手动编写许多绑定器,请查看一些可以帮助您以声明方式进行转换的工具,如AutoMapper

答案 1 :(得分:1)

您是否尝试将ID作为参数添加到Post操作?

public Edit(int? id){ /* Codes */ }

[HttpPost]
public Edit(int id, Item model){ /* Codes */ }

这样,当回发表单时,将从URL填充id。

答案 2 :(得分:1)

Item模型上的属性是ItemID吗?如果是这样,那么如果您在名为ID的字段周围传递,则默认模型绑定器不会填充它。如果您更改方法签名以使参数名称与您的Item属性名称匹配,则它应该按预期工作。

答案 3 :(得分:0)

Phil Haack有一个帖子可能与你正在做的事情有关,也可能没有。

此外,如果您没有将ID作为表单(隐藏字段或诸如此类的一部分)的一部分发送到客户端,并且它不是POST URL的一部分,那么只有你没有它才有意义在POST上正确填充了ID字段。

答案 4 :(得分:0)

MVC 2解决ID问题的方法是Optional URL Parameters

如果你还在使用MVC 1,那么在方法参数上使用绑定属性:

[HttpPost]
public ActionResult Edit([Bind(Exclude = "ItemID")] Item model)
{
    // ...
}

答案 5 :(得分:0)

回答很少,但是当使用剃刀时,使用隐藏的字段来将Id绑定到模型。

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

完整的表单帖子可能如下所示:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Address</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.Id)

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

        <div class="form-group">
            @Html.LabelFor(model => model.StreetLine1, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.StreetLine1, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.StreetLine1, "", 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>
}