【问题标题】:ASP.NET. MVC2. Entity Framework. Cannot pass primary key value back from view to [HttpPost]ASP.NET。 MVC2。实体框架。无法将主键值从视图传回 [HttpPost]
【发布时间】:2010-05-10 07:06:49
【问题描述】:

我将一个 ViewModel(其中包含一个“Person”对象)从“EditPerson”控制器操作传递到视图中。当从视图回传时,ActionResult 接收除 ID 之外的所有 Person 属性(它说它是零而不是说它的真正整数)

谁能告诉我为什么?

控制器如下所示:

        public ActionResult EditPerson(int personID)
    {          
        var personToEdit = repository.GetPerson(personID);

        FormationViewModel vm = new FormationViewModel();

        vm.Person = personToEdit;

        return View(vm);
    }

    [HttpPost]
    public ActionResult EditPerson(FormationViewModel model) <<Passes in all properties except ID
    {
      // Persistence code
    }

视图如下所示:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Afp.Models.Formation.FormationViewModel>" %>
    <fieldset>
        <legend>Fields</legend>


        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Title) %>
        </div>

        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Title) %>
            <%= Html.ValidationMessageFor(model => model.Person.Title) %>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Forename)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Forename)%>
            <%= Html.ValidationMessageFor(model => model.Person.Forename)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Surname)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Surname)%>
            <%= Html.ValidationMessageFor(model => model.Person.Surname)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.DOB) %>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.DOB, String.Format("{0:g}", Model.DOB))
            <%= Html.ValidationMessageFor(model => model.DOB) %>
        </div>--%>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Nationality)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Nationality)%>
            <%= Html.ValidationMessageFor(model => model.Person.Nationality)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Occupation)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Occupation)%>
            <%= Html.ValidationMessageFor(model => model.Person.Occupation)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.CountryOfResidence)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.CountryOfResidence)%>
            <%= Html.ValidationMessageFor(model => model.Person.CountryOfResidence)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.PreviousNameForename)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.PreviousNameForename)%>
            <%= Html.ValidationMessageFor(model => model.Person.PreviousNameForename)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.PreviousSurname)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.PreviousSurname)%>
            <%= Html.ValidationMessageFor(model => model.Person.PreviousSurname)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Email)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Email)%>
            <%= Html.ValidationMessageFor(model => model.Person.Email)%>
        </div>

        <p>

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

        </p>
    </fieldset>

Person 类看起来像:

[MetadataType(typeof(Person_Validation))]
public partial class Person
{
    public Person()
    {
    }
}

[Bind(Exclude = "ID")]
public class Person_Validation
{
    public int ID { get; private set; }
    public string Title { get; set; }
    public string Forename { get; set; }
    public string Surname { get; set; }
    public System.DateTime DOB { get; set; }
    public string Nationality { get; set; }
    public string Occupation { get; set; }
    public string CountryOfResidence { get; set; }
    public string PreviousNameForename { get; set; }
    public string PreviousSurname { get; set; }
    public string Email { get; set; }
}

和 ViewModel:

public class FormationViewModel
{

    public Company Company { get; set; }

    public Address RegisteredAddress { get; set; }

    public Person Person { get; set; }

    public PersonType PersonType { get; set; }

   public int CurrentStep { get; set; }
}

}

【问题讨论】:

    标签: asp.net-mvc entity-framework


    【解决方案1】:

    删除

    [Bind(Exclude = "ID")] 
    

    来自你的模型类。

    【讨论】:

      【解决方案2】:

      ID 未发布,因为它不在表单内。您可以将其作为隐藏字段包含在内:

      <%= Html.HiddenFor(model => model.Person.ID) %>
      

      【讨论】:

      • 不幸的是没有运气。我添加了它,但仍然得到一个 0 ID 传回
      • 呈现表单的操作需要填充它。
      • 不是 "vm.Person = personToEdit;" “ActionResult EditPerson(personID) 操作中的行为我执行此操作?它在调试器中显示它正在将其正确的实整数传递给视图,这可能是向我显示错误信息吗?
      • 感谢您的回答,它让我了解了一些情况。我所需要的只是删除 Bind exclude et viola!
      猜你喜欢
      • 2010-11-04
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多