POST操作后,控制器中的Model Key和Foreign Key参数为null

时间:2013-05-05 21:48:49

标签: c# .net asp.net-mvc asp.net-mvc-4 ef-code-first

我的视图中有以下隐藏字段:

@Html.HiddenFor(model => model.cat.Id)
@Html.HiddenFor(model => model.cat.OwnerId)
@Html.HiddenFor(model => model.cat.BirthDate        
@Html.HiddenFor(model => model.cat.Weight)

Id是Key,OwnerId是ForeignKey。当我尝试编辑该模型时,所有值都正确显示但问题是当我尝试将这些值POST回来时。 Id和OwnerId始终为0.我的视图中有很多其他值,如下拉列表,文本框等,所有这些值都正确发布。问题仅在于Id和OwnerId。

控制器:

[HttpPost]
public ActionResult Edit(EditCatDetailsViewModel model)
{
Debug.WriteLine("Cat Id: " + model.cat.Id); //displays 0
}

我检查了网站的来源,我看到Id和OwnerId有正确的值(值不是0)。我的问题是为什么这些值不像所有其他值一样发送?为什么他们在控制器中收到0?

谢谢!

更新

Cat编辑视图:

@model Pro.Web.Models.EditCatDetailsViewModel

@{
    ViewBag.Title = "Edit";
}

<h2>Edit Cat Details</h2>

@using (Html.BeginForm())
{
@Html.ValidationSummary(true)

<fieldset>
    <legend>Cat</legend>

    @Html.HiddenFor(model => model.cat.Id)
    @Html.HiddenFor(model => model.cat.OwnerId)
    @Html.HiddenFor(model => model.cat.BirthDate        
    @Html.HiddenFor(model => model.cat.Weight)

    <div class="editor-label">
        @Html.LabelFor(model => model.cat.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.cat.Name)
        @Html.ValidationMessageFor(model => model.cat.Name)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.cat.Description)
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(model => model.cat.Description, new { @style="width:400px; height:600px" })
        @Html.ValidationMessageFor(model => model.cat.Description)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.cat.NumberOfKittens)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.cat.NumberOfKittens)
        @Html.ValidationMessageFor(model => model.cat.NumberOfKittens)
    </div>

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

<div>
@Html.ActionLink("Back to Details", "Details")
</div>

2 个答案:

答案 0 :(得分:0)

最后,我设法做到了这一点。我在EditCatDetailsViewModel中添加了一个代表cat id的附加变量。

现在这是该模型的简化外观:

public class EditCatDetailsViewModel
{
    public Cat cat { get; set; }
    public int catId { get; set; }

}

在我的GET Edit方法中,我在Cat模型中设置Id来自Id:

// GET: /Cats/Edit/5

    public ActionResult Edit(int id = 0)
    {
        Cat cat = _catRepository.Find(id);

        if (cat == null)
        {
            return HttpNotFound();
        }

        EditCatDetailsViewModel model = new EditCatDetailsViewModel();
        model.cat = cat;
        model.catId = cat.Id;

        return View(model);
    }

在我的视图中,我添加了额外的隐藏元素:

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

现在我可以在POST方法中访问该ID:

[HttpPost]
public ActionResult Edit(EditCatDetailsViewModel model)
{
    Debug.WriteLine("Cat Id: " + model.catId); //displays correct Id for Cat!!!
    model.cat.Id = model.catId;
}

现在一切正常,我可以保存对数据库的更改。我仍然感兴趣的是为什么这些值没有第一次发布。

答案 1 :(得分:-1)

嗨似乎通过剃刀生成的隐藏字段在重新发布它们时不会更新它们的值。所以请尝试通过html syntex创建隐藏的字段,而不是像这样使用剃刀:

    <input type="hidden" id="" name="" value="@Model.model.cat.Id" />
    <input type="hidden" id="" name="" value="@Model.model.cat.OwnerId" />

检查您的页面来源并从那里复制这些隐藏字段的name属性值并在此处指定它们现在检查我希望您也会在您的操作方法中获得这些值。