模型在提交到服务器后保留其值

时间:2014-12-09 12:04:35

标签: asp.net-mvc asp.net-mvc-4 razor

我正面临这个奇怪的问题,无法理解它,我有一个接受Person Id的表单,然后从API中读取数据并填充UI以供人编辑。

enter image description here

以下是此表单的标记,我猜它与模型绑定有关,因为我有两个Form标记,并且都具有相同的Model Id。

@using (Html.BeginForm("UpdatePerson", "Person", FormMethod.Get))
{
    <table>
        <tr>
            <td colspan="2">
                <h3>Read Person for Edit</h3>
            </td>
        </tr>
        <tr>
            <td>
                <label>@Html.LabelFor(m => m.Id)</label>
            </td>
            <td>
                @Html.TextBoxFor(m => m.Id)
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" name="btnReadPerson" value="Read Person" />
            </td>
        </tr>
    </table>
}
@using (Html.BeginForm("UpdatePerson", "Person", FormMethod.Post))
{
    <table>
        <tr>
            <td>
                <label>@Html.LabelFor(m => m.Id)</label>
            </td>
            <td>
                @Html.TextBoxFor(m => m.Id, new { @readonly = "readonly" })
            </td>
        </tr>
        <tr>
            <td>
                <label>@Html.LabelFor(m => m.Type)</label>
            </td>
            <td>
                @Html.TextBoxFor(m => m.Type)
            </td>
        </tr>
我已经剥夺了观点,我试图保持简短。

以下是处理Get

的Action
 [HttpGet]
 [ActionName("UpdatePerson")]
 public ActionResult UpdatePersonRead(PersonEditModel model)
    {
        if (model.Id.HasValue) 
        {
            var apiClient = new ApiClient (ApiVersions.v1);
            var segmentReplaceList = new Dictionary<string, string> { { "{id}", model.Id.Value.ToString() } };
            bool ApiHitStatus = false;
            var result = apiClient.MakeAPIRequest(out ApiHitStatus, ResourceUriKey.Person, segmentReplaceList, HttpVerbs.Get, string.Empty);

            model = new PersonEditModel();
            if (ApiHitStatus)
            {
                var personToBeUpdated = JsonConvert.DeserializeObject<RootChildPerson>(result);
                if (personToBeUpdated != null)//Assigning json obj to model
                {
                    model.NameFirst = personToBeUpdated.name_first;
                    model.NameLast = personToBeUpdated.name_last;
                    model.NameMiddle = personToBeUpdated.name_middle;
                    model.SocialSecurityNumber = personToBeUpdated.social_security_number;
                    model.SubType = PersonHelper.SubTypeValue(personToBeUpdated.sub_type);
                    model.Type = "person";
                    model.DateOfBirth = personToBeUpdated.date_of_birth;
                    model.Id = personToBeUpdated.id;
                }
            }
        }

        return View(model);
    }

现在由于Person Id 4不对应任何人,所以我收到Null json对象,在转换为C#类时导致为空(不为null,因为它将每个属性设置为null或为空)personToBeUpdated对象是然后分配给模型,我已经检查了model.Id在Controller中甚至在视图中变为null,但不知何故,它为两个Person Id文本框分配输入值4(它为空)。 请告诉我这里发生的事情。

1 个答案:

答案 0 :(得分:1)

正如@StephenMuecke评论的那样,所以我在更新之前清除了模型。

model = new PersonEditModel();
ModelState.Clear();

有趣的是,视图从ModelState而不是当前指定的模型

获取数据
  

HtmlHelpers控件(如.TextBoxFor()等)不会绑定到Postback上的模型值,而是从ModelState直接从POST缓冲区中获取它们的值。

取自 ASP.NET MVC Postbacks and HtmlHelper Controls ignoring Model Changes