视图中未使用的MVC 2模型属性返回null或空

时间:2011-03-16 16:17:51

标签: asp.net-mvc properties model null

我遇到的问题是当我将填充的对象传递给不显示所有属性的视图时。

public ActionResult Edit(Guid clientID)
{
    Property property = PropertyModel.GetPropertyDetails(clientID);
    return View("Edit", "Site", property);
}

查看:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<WebFrontend.ViewModels.Property>" %>

<% using (Html.BeginForm())
   {%>
    <%: Html.ValidationSummary(true, "Property update was unsuccessful. Please correct the errors and try again.") %>

    <fieldset>
        <legend>Edit Account: <%: Model.ClientAccountNo %></legend>

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

        <p>
            <input type="submit" value="Update Property" />
        </p>
    </fieldset>

<% } %>

提交时,Property对象被传递给此控制器方法,但视图中未使用的所有属性都为null或为空,包括在提交之前视图中存在的Model.ClientAccountNo。

[HttpPost]
    public ActionResult Edit(Property property)
    {
        if (ModelState.IsValid)
        {
            bool success = PropertyModel.UpdateProperty(property);
            if (success)
            {
                // property has been updated, take them to the property details screen.
                return RedirectToAction("Details", "Property", new { clientID = property.ClientID });
            }
            else
            {
                ModelState.AddModelError("", "Could not update property.");
                return View("Activate", "Site", property);
            }
        }
        // If we got this far, something failed, redisplay form
        return View("Edit", "Site", property);
    }

我在网上找不到任何类似内容,任何解释为什么会发生这种情况以及如何解决这一问题将不胜感激。

2 个答案:

答案 0 :(得分:2)

这是MVC的工作方式 - 它尝试从路由,表单和查询字符串中的值构造操作参数类型的对象。在您的情况下,它只能获取表单集合中的值。它不知道您存储在数据库中的值。

如果您只对某些属性感兴趣,那么最好只使用这些属性来制作特定的视图模型 - 那么您可以验证此特定情况。

如果您将值存储在隐藏字段中,请记住可以操作这些值 - 如果这是一个问题,请务必使用仅包含可编辑字段的特定视图模型。

答案 1 :(得分:0)

由于您未在URL中传递未使用的属性,因此您必须为它们渲染隐藏字段。使用Html.HiddenFor方法。