Mvc模型在提交时id为0的问题

9

我有一个模型的编辑页面。当我将模型发送回我的控制器时,Id属性为0。如何在提交后保持Id属性?

我正在将模型发布到视图中,因此Id属性在获取请求时设置。 我的代码如下。

视图:

@model xandra.Models.ProjectModel

@using(Html.BeginForm())
{ 
    @Html.HiddenFor(m => m.Id) 
    @Html.LabelFor(m => m.Name)
    @Html.TextBoxFor(m => m.Name)

    <br />

    @Html.LabelFor(m => m.Description)
    @Html.TextAreaFor(m => m.Description)

    <br />

    @Html.LabelFor(m => m.Website)
    @Html.TextBoxFor(m => m.Website)

    <br />

    @Html.LabelFor(m => m.Active)
    @Html.CheckBoxFor(m => m.Active)

    <input type="submit" value="Save" />
}

控制器:

[Authorize]
[HttpGet]
[InitializeSimpleMembership]
public ActionResult EditProject(string id)
{
    using (var entity = new dixraContext())
    {
        var project = entity.Projects.FirstOrDefault(m => m.UrlName == id);


        return View(project);
    }
}

[Authorize]
[HttpPost]
[InitializeSimpleMembership]
public ActionResult EditProject(ProjectModel model)
{
    using (var entity = new dixraContext())
    {
        var project = entity.Projects.FirstOrDefault(m => m.Id == model.Id);

        project.Name = model.Name;
        project.Description = model.Description;
        project.Website = model.Website;
        project.Tags = model.Tags;
        project.Active = model.Active;

        entity.SaveChanges();

        return RedirectToAction("GetProject", project.UrlName);
    }
}

我的模型
public class ProjectModel
{
    [Key]
    [Required]
    public long Id { get; set; }

    [Required(AllowEmptyStrings=false)]
    public string Name { get; set; }

    [Required(AllowEmptyStrings=false)]
    public string Description { get; set; }

    [Required]
    public DateTime CreatedDate { get; set; }

    [Required]
    public int Creator { get; set; }

    public string Website { get; set; }

    [Required]
    public int CategoryId { get; set; }

    public virtual List<TagModel> Tags { get; set; }

    public string UrlName { get; set; }

    public bool Active { get; set; }
}

你能确保Id属性有getter和setter - public int Id { get; set; }吗? - Win
@Win 是的,我编辑了问题并添加了我的模型类。 - Sefa
你需要有一个隐藏的ID吗?试着不用它。 - mrtig
1
参考链接:https://dev59.com/zm445IYBdhLWcg3wws0u - Jason Evans
7个回答

8

我之前见过这种情况,可能是个bug。我已经通过添加需要在post中包含的属性,而不使用特定视图模板语法来解决这个问题。

改为

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

请使用这个:
<input type="hidden" value="@Model.Id" name="Id"/> 

1
不知道为什么这样做可以解决问题,但它确实解决了。 - Don Rolling
可能是由于URL引起的。我在URL中有一个ID,因此默认情况下会使用它。上面的更改强制它使用模型。 - Alex Stephens
1
这对我没有解决问题。 - Mike

1

我认为这与 asp.net MVC 强制将模型返回给用户以便服务器进行提交有关。您可以使用以下属性覆盖此行为...

void ControllerAction([Bind(Exclude = "Id")]SomeModel model)
{
  //action stuff here
}

1

我曾经遇到过同样的问题。数据库表的主键列缺少身份规范,例如 int identity(1,1)。修复后,实体框架不再将 id 列设置为 0。


1

我有同样的问题。这是解决方案: 在控制器类的操作函数(处理已发布的数据)中添加以下行:

ModelState.Remove("Id");

如果您不这样做,那么您在模型中分配给 Id 属性的任何值都将被 POST 请求中的值替换。因此,如果不从 ModelState 中删除它,则模型中的 Id 更改将没有效果。

0

@Sefa

你的控制器操作中缺少id。

project.id = model.id;(缺失)

project.Name = model.Name;
project.Description = model.Description;

0
如果您在页面之间进行发布,请确保页面上没有隐藏字段会提交值。例如,如果第1页将a值设置为1并路由到第2页,则第2页将把a值设置为1。但是,如果您将第2页路由回第1页并且第1页有一个隐藏字段用于传递给第2页的值,则如果它是长数字或十进制数,则该值将被设置为0。我希望这可以帮助那些处理在不同页面之间发布值的问题的人们。

0
我曾经有同样的问题,解决方法是:将设置函数从私有改为公共。

4
如果可能的话,请尝试解释为什么这个改变可以解决这个问题。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接